美文网首页
如何监听动画中view的frame

如何监听动画中view的frame

作者: AlienJunX | 来源:发表于2016-05-23 12:56 被阅读875次

在使用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

相关文章

  • 如何监听动画中view的frame

    在使用UIView 动画的时候,想监控view的一些动画属性,比如frame、center 等,怎么办呢? 也许你...

  • iOS如何监听动画中view的frame UIView.a

    在使用UIView 动画的时候,想监控view的一些动画属性,比如frame、center 等,怎么办呢? 也许你...

  • 键盘位置改变View跟着变化

    键盘位置改变View跟着变化 1、订阅键盘的frame即将改变的通知 //监听键盘frame变化 [[NSNoti...

  • ios给动画中的view添加点击事件

    动画中的view,其frame不在肉眼所见的位置,所以需要其他方式接收点击事件。 步骤1:将点击事件指向view ...

  • 解答

    1、改变view的frame,layer的frame是否会变化?改变layer.frame,view的frame是...

  • 考试题

    一、 1.frame与bounds的区别: (1) Frame: frame的view是在父视图的view坐标...

  • iOS中View的位置和大小

    frame bounds center frame bounds center是View的属性,定义了View的位...

  • iOS - 自动提示宏

    自动提示宏:能在输入宏的时候像属性一样让Xcode有提示功能 一.宏代码: 比如监听view的frame的变化不使...

  • 常用的一些宏

    ## #pragma mark -输出frame NSLog(@" view frame = %@", NSStr...

  • iOS纪录

    (1)View的Frame与Bounds区别 摘自 ios view的frame和bounds之区别(位置和大小)...

网友评论

      本文标题:如何监听动画中view的frame

      本文链接:https://www.haomeiwen.com/subject/btuarttx.html