iOS如何監(jiān)聽動畫中view的frame UIView.animate

在使用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];
    }];
}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容