在使用UIView 動畫的時候囱桨,想監(jiān)控view的一些動畫屬性,比如frame嗅绰、center 等舍肠,怎么辦呢? 也許你會說KVO吧窘面,你試試看翠语,其實不行。
試想如果在繪畫周期里面獲取一次是不是可行呢财边, 使用CADisplayLink肌括,它每秒固定可以執(zhí)行60次;然后每次執(zhí)行方法時在這個方法里面獲取view的展現(xiàn)層(presentationLayer)的frame酣难。因為只有顯示層發(fā)生的變化我們用戶才看得到谍夭,這時候frame才有意義。
在動畫開始時候啟用CADisplayLink進行檢測憨募,動畫結(jié)束時候停止CADisplayLink紧索。
// 監(jiān)聽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];
}
// 停止監(jiān)聽MyView
- (void)stopWatchMyView {
[self.displayLink invalidate];
self.displayLink = nil;
[self watchMyViewAction];
}
- (void)handleMaskViewWithMyViewFrame:(CGRect)myFrame {
// 下面是根據(jù)myFrame 進行其他相關(guān)view的繪制
[self.myView setNeedsDisplay];
// mask處理overlayView
self.overlayView.maskFrame = myFrame;
[self.overlayView setNeedsDisplay];
}
/////////// 觸發(fā)動畫 ///////////////
- (void)adjustMyView {
// 開始監(jiān)控MyView,動畫完成后停止監(jiān)控
[self startWatchMyView];
[UIView animateWithDuration:0.15 delay:0 options:UIViewAnimationOptionCurveEaseIn animations:^{
self.myView.frame = self.clipFrame;
} completion:^(BOOL finished) {
// 停止監(jiān)控ClipAreaView
[self stopWatchMyView];
// 調(diào)整imageView 的位置
[self adjustImageView];
}];
}
效果如下所示馋嗜,裁剪框就是根據(jù)裁剪比例進行調(diào)整了frame齐板,其后面的遮罩view被掏空是根據(jù)這個frame 來繪制, 所以這樣就可以跟隨frame進行動畫了葛菇。