iOS 监听普通 UIView 的曝光封装

前阶段做版本需求,在后期大概花了一半的时间在业务统计上,特别是曝光统计,是带有业务性质的统计,所以无痕埋点暂时没辙,每次都需要花费大量精力,所以决定整理下 UIView曝光监听

当然它的用途并不是仅在曝光统计上,一些想要延迟到曝光时才做的事情均可以滴,譬如 UIScrollView 上的 UIImageView 的图片加载操作就可以等到曝光的时候才去加载,酱紫若是 UIScrollView 有多个 UIImageView 的子视图,也不会内存暴涨呢

总结下来其实就是:将一些操作 延迟到曝光 后才做

  • 基本要求
    a. 简单设置 UIView 的曝光操作 exposureBlock ,即可在 UIView 曝光时执行
    b. 在主线程休闲时进行 UIView 的曝光计算
    c. UIView 曝光过后,重新设置 exposureBlock,再次进入曝光计算并曝光时执行

  • 实现
    监听 UIView 曝光封装
    a. 目前的实现思路主要是监听 mainRunLoop,在收到 kCFRunLoopBeforeWaiting 即将进入休眠的通知时进行曝光计算,以防阻塞正常的主线程操作
    b. UIView 的曝光计算,主要⚠️ 隐藏 或者 透明度太低 或者 window == nil ,其它均为常规计算与屏幕的 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 的相关曝光
    b. PageViewContrller 预加载页面的曝光处理
    c. 整个页面的延迟曝光,某个 UIView 的延迟曝光
    d. 曝光补偿 - 已加

你可能感兴趣的:(iOS 监听普通 UIView 的曝光封装)