前階段做版本需求,在后期大概花了一半的時間在業(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.UITableViewUICollectionView的相關(guān)曝光
b.PageViewContrller預加載頁面的曝光處理
c. 整個頁面的延遲曝光,某個UIView的延遲曝光
d.曝光補償 - 已加