在使用UIView 動(dòng)畫的時(shí)候拯辙,想監(jiān)控view的一些動(dòng)畫屬性郭变,比如frame颜价、center 等,怎么辦呢诉濒? 也許你會(huì)說KVO吧周伦,你試試看,其實(shí)不行未荒。
試想如果在繪畫周期里面獲取一次是不是可行呢专挪, 使用CADisplayLink,它每秒固定可以執(zhí)行60次片排;然后每次執(zhí)行方法時(shí)在這個(gè)方法里面獲取view的展現(xiàn)層(presentationLayer)的frame寨腔。因?yàn)橹挥酗@示層發(fā)生的變化我們用戶才看得到,這時(shí)候frame才有意義率寡。
在動(dòng)畫開始時(shí)候啟用CADisplayLink進(jìn)行檢測(cè)迫卢,動(dòng)畫結(jié)束時(shí)候停止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 進(jìn)行其他相關(guān)view的繪制
[self.myView setNeedsDisplay];
// mask處理overlayView
self.overlayView.maskFrame = myFrame;
[self.overlayView setNeedsDisplay];
}
/////////// 觸發(fā)動(dòng)畫 ///////////////
- (void)adjustMyView {
// 開始監(jiān)控MyView冶共,動(dòng)畫完成后停止監(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];
}];
}