CATransaction事務(wù)
動畫執(zhí)行的時(shí)間取決于當(dāng)前事務(wù)的設(shè)置,動畫類型取決于圖層行為
- begin 入棧([CATransaction setDisableActions:YES];)
- commit 出棧
- setAnimationDuration 設(shè)置當(dāng)前事務(wù)的動畫時(shí)間(默認(rèn)0.25秒)
- setCompletionBlock 添加動畫完成的代碼塊
[CATransaction begin];
[CATransaction setAnimationDuration:1.0];
[CATransaction setCompletionBlock:^{
CGAffineTransform transform = self.colorLayer.affineTransform;
transform = CGAffineTransformRotate(transform, M_PI_2);
self.colorLayer.affineTransform = transform;
}];
CGFloat red = arc4random() / (CGFloat)INT_MAX;
CGFloat green = arc4random() / (CGFloat)INT_MAX;
CGFloat blue = arc4random() / (CGFloat)INT_MAX;
self.colorLayer.backgroundColor = [UIColor colorWithRed:red
green:green
blue:blue
alpha:1.0].CGColor;
[CATransaction commit];
- UIView關(guān)聯(lián)的圖層禁用了隱式動畫,對圖層做動畫的唯一方法就是使用UIView的動畫函數(shù)([UIView beginAnimations:nil context:nil];[UIView commitAnimations];)或者繼承UIView,覆蓋
-actionForLayer:forKey:
方法,或者使用顯示動畫。(可直接使用方法:+animateWithDuration:animations:)
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:1];
CGFloat red = arc4random() / (CGFloat)INT_MAX;
CGFloat green = arc4random() / (CGFloat)INT_MAX;
CGFloat blue = arc4random() / (CGFloat)INT_MAX;
self.colorLayer.backgroundColor = [UIColor colorWithRed:red
green:green
blue:blue
alpha:1.0].CGColor;
[UIView commitAnimations];
- 對于單獨(dú)存在的圖層,我們可以通過實(shí)現(xiàn)圖層的
actionForLayer:forKey:
委托方法,或者提供一個(gè)actions
字典來控制隱式動畫(CATransition推進(jìn)過渡)
self.colorLayer = [CALayer layer];
self.colorLayer.frame = CGRectMake(50.0f, 50.0f, 100.0f, 100.0f);
self.colorLayer.backgroundColor = [UIColor blueColor].CGColor;
CATransition *transition = [CATransition animation];
transition.type = kCATransitionPush;
transition.subtype = kCATransitionFromLeft;
self.colorLayer.actions = @{@"backgroundColor": transition};
[self.layerView.layer addSublayer:self.colorLayer];
- 呈現(xiàn)圖層 presentationLayer
呈現(xiàn)圖層實(shí)際是對模型圖層的復(fù)制,它的屬性值代表任何指定時(shí)刻的當(dāng)前外觀效果,即你可以通過呈現(xiàn)圖層的值來獲取當(dāng)前屏幕上真正顯示的值
實(shí)現(xiàn)基于定時(shí)器的動畫
,可以通過呈現(xiàn)圖層獲取某一時(shí)刻的圖層位置
如果想讓做動畫的圖層響應(yīng)用戶輸入
,可以使用呈現(xiàn)圖層調(diào)用-hitTest:
判斷是否被點(diǎn)擊