如何监听动画中view的frame

在使用UIView 动画的时候,想监控view的一些动画属性,比如frame、center 等,怎么办呢? 也许你会说KVO吧,你试试看,其实不行。
试想如果在绘画周期里面获取一次是不是可行呢, 使用CADisplayLink,它每秒固定可以执行60次;然后每次执行方法时在这个方法里面获取view的展现层(presentationLayer)的frame。因为只有显示层发生的变化我们用户才看得到,这时候frame才有意义。

在动画开始时候启用CADisplayLink进行检测,动画结束时候停止CADisplayLink。

// 监听MyView
- (void)startWatchMyView {
    [self stopWatchMyView];
    self.displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(watchMyViewAction)];
    [self.displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
}

- (void)watchMyViewAction {
    CALayer *presentationLayer = self.myView.layer.presentationLayer;
    [self handleMaskViewWithMyViewFrame:presentationLayer.frame];
}

// 停止监听MyView
- (void)stopWatchMyView {
    [self.displayLink invalidate];
    self.displayLink = nil;
    [self watchMyViewAction];
}

- (void)handleMaskViewWithMyViewFrame:(CGRect)myFrame {
    // 下面是根据myFrame 进行其他相关view的绘制
    [self.myView setNeedsDisplay];
    
    // mask处理overlayView
    self.overlayView.maskFrame = myFrame;
    [self.overlayView setNeedsDisplay];
}


/////////// 触发动画 ///////////////

- (void)adjustMyView {
    // 开始监控MyView,动画完成后停止监控
    [self startWatchMyView];
    
    [UIView animateWithDuration:0.15 delay:0 options:UIViewAnimationOptionCurveEaseIn animations:^{
        self.myView.frame = self.clipFrame;
    } completion:^(BOOL finished) {
        // 停止监控ClipAreaView
        [self stopWatchMyView];
        // 调整imageView 的位置
        [self adjustImageView];
    }];
}

效果如下所示,裁剪框就是根据裁剪比例进行调整了frame,其后面的遮罩view被掏空是根据这个frame 来绘制, 所以这样就可以跟随frame进行动画了。

521985651.gif
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥ios动画全貌。在这里你可以看...
    每天刷两次牙阅读 8,557评论 6 30
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,214评论 4 61
  • 原生的Json在封装的时候,如果value为空的话,则不会添加这条键值对,想实现如果value为空的话也记录下来。...
    Pencilso阅读 809评论 0 5
  • 情义这东西不是一见如故容易,难的是来日方长的陪伴。流浪歌手,背包客他那时追求的生活还不是生活,而是生存!普通朋友难...
    每天慌阅读 2,566评论 0 0
  • 大家好,我是刺鸡 这是我的第24个故事 每次去厕所 看到坐厕墙壁上的鞋印 地上的尿渍 我心中就有一万个“草泥马” ...
    刺鸡阅读 2,936评论 0 0