iOS 監(jiān)聽普通 UIView 的曝光封裝

前階段做版本需求,在后期大概花了一半的時間在業(yè)務統(tǒng)計上,特別是曝光統(tǒng)計,是帶有業(yè)務性質(zhì)的統(tǒng)計,所以無痕埋點暫時沒轍,每次都需要花費大量精力,所以決定整理下 UIView曝光監(jiān)聽

當然它的用途并不是僅在曝光統(tǒng)計上,一些想要延遲到曝光時才做的事情均可以滴,譬如 UIScrollView 上的 UIImageView 的圖片加載操作就可以等到曝光的時候才去加載,醬紫若是 UIScrollView 有多個 UIImageView 的子視圖,也不會內(nèi)存暴漲呢

總結(jié)下來其實就是:將一些操作 延遲到曝光 后才做

  • 基本要求
    a. 簡單設置 UIView 的曝光操作 exposureBlock ,即可在 UIView 曝光時執(zhí)行
    b. 在主線程休閑時進行 UIView 的曝光計算
    c. UIView 曝光過后,重新設置 exposureBlock,再次進入曝光計算并曝光時執(zhí)行

  • 實現(xiàn)
    監(jiān)聽 UIView 曝光封裝
    a. 目前的實現(xiàn)思路主要是監(jiān)聽 mainRunLoop,在收到 kCFRunLoopBeforeWaiting 即將進入休眠的通知時進行曝光計算,以防阻塞正常的主線程操作
    b. UIView 的曝光計算,主要?? 隱藏 或者 透明度太低 或者 window == nil ,其它均為常規(guī)計算與屏幕的 rect 是否有碰撞即可
    c. 添加 UIView 的曝光必須是線程安全的,目前均在主線程添加

  • 使用

  UIView *view = [[UIView alloc] initWithFrame:CGRectMake(10, 10, 30, 30)];
  view.ly_exposureBlock = ^(UIView *view) {
      //曝光了,做點啥
     // UIScrollview上的UIImageView可以在曝光時才去加載圖片等
  };
  [self.view addSubview:view];
  
  ....
  
  view.ly_exposureBlock = ^(UIView *view) {
      //曝光后重新設置曝光操作,會再次曝光,那又做點啥
  };
  UIImageView *imgView = [[UIImageView alloc] init];
  imgView.ly_exposureBlock = ^(UIImageView *imgView) {
        //曝光后才去加載圖片
       [imgView sd_setImageWithURL:imgUrl];
  };
   UIView *view1 = [[UIView alloc] initWithFrame:CGRectMake(-40, -50, 30, 30)];
    view1.ly_exposureBlock = ^(UIView *view) {
        // view1 曝光了,做點啥
    };
    [self.view addSubview:view1];
    
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
       //增加曝光補償后,view1 才會曝光
        view2.ly_ECompensationSize = CGSizeMake(15, 25);
    });
  • 完善期望
    a. UITableView UICollectionView 的相關(guān)曝光
    b. PageViewContrller 預加載頁面的曝光處理
    c. 整個頁面的延遲曝光,某個 UIView 的延遲曝光
    d. 曝光補償 - 已加
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容