日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

之一:CABasicAnimation - 基本动画

發布時間:2025/3/19 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 之一:CABasicAnimation - 基本动画 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

嗷嗚嗷嗚嗷嗚

1 // 將視圖作為屬性方便后面執行多個不同動畫 2 _myView = [[UIView alloc] init]; 3 _myView.layer.position = CGPointMake(100, 100); 4 _myView.layer.bounds = CGRectMake(0, 0, 100, 100); 5 _myView.backgroundColor = [UIColor blueColor]; 6 [self.view addSubview:_myView]; 7 [_myView release];

?平移動畫(1)

1 // 創建一個CABasicAnimation類型的動畫對象并對CALayer的position屬性執行動畫 2 CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"position"]; 3 4 // 動畫持續1.5s 5 anim.duration = 1.5; 6 7 // position屬性值從(50, 80)漸變到(300, 350) 8 anim.fromValue = [NSValue valueWithCGPoint:CGPointMake(50, 80)]; 9 anim.toValue = [NSValue valueWithCGPoint:CGPointMake(300, 350)]; 10 11 // 設置動畫的代理 12 anim.delegate = self; 13 14 // 保持動畫執行后的狀態 15 anim.removedOnCompletion = NO; 16 anim.fillMode = kCAFillModeForwards; 17 18 // 添加動畫對象到myView的圖層上 19 [_myView.layer addAnimation:anim forKey:@"translate"];
  • 上面實現了平移動畫
  • 想要實現不同的效果,最關鍵的地方就是第2行CABasicAnimation對象的初始化方法中keyPath的設定。必須是CALayer的某項屬性。
  • 第8、9行這里的屬性接收的是id類型的參數所以不能直接使用CGPoint這種結構體類型,而是要先包裝成NSValue對象后再使用。
  • 注意:可以嘗試將第9行的toValue換成byValue ?區別:前者是到指定的位置,后者是在當前的位置上增加多少

  • 默認情況下,動畫執行完畢后,動畫會自動從CALayer上移除,CALayer又會回到原來的狀態。為了保持動畫執行后的狀態,可以加入第15、16行代碼

    fillMode的作用就是決定當前對象過了非active時間段的行為。比如動畫開始之前,動畫結束之后。如果是一個動畫CAAnimation,則需要將其removedOnCompletion設置為NO,要不然fillMode不起作用.

    kCAFillModeRemoved?默認值 也就是說當動畫開始前和動畫結束后,動畫對layer都沒有影響,動畫結束后,layer會恢復到之前的狀態?
    kCAFillModeForwards?當動畫結束后,layer會一直保持著動畫最后的狀態?
    kCAFillModeBackwards?這個和kCAFillModeForwards是相對的,就是在動畫開始前,你只要將動畫加入了一個layer,layer便立即進入動畫的初始狀態并等待動畫開始.你可以這樣設定測試代碼,將一個動畫加入一個layer的時候延遲5秒執行.然后就會發現在動畫沒有開始的時候,只要動畫被加入了layer,layer便處于動畫初始狀態?
    kCAFillModeBoth?理解了上面兩個,這個就很好理解了,這個其實就是上面兩個的合成.動畫加入后開始之前,layer便處于動畫初始狀態,動畫結束后layer保持動畫最后的狀態.

  • 第19行后面的@"translate"只是給動畫對象起了個名稱,也可以直接給個nil,但是為方便以后可以調用CALayer的removeAnimationForKey:方法根據動畫名稱來移除相應的動畫
  • 第12行后面的self是視圖控制器。代理需要實現的方法:
1 #pragma mark -----動畫開始----- 2 - (void)animationDidStart:(CAAnimation *)anim { 3 NSLog(@"動畫開始了"); 4 } 5 6 #pragma mark -----動畫結束----- 7 - (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag { 8 // 查看一下動畫執行完畢后的position值 9 NSString *string = NSStringFromCGPoint(_myView.layer.position); 10 NSLog(@"動畫結束了,position:%@", string); 11 }

運行后發現, 在實質上,圖層的屬性值還是動畫執行前的初始值,并沒有真正被改變。

1 // 移除動畫 2 [_myView.layer removeAnimationForKey:@"translate"]

?

平移動畫(2)?

1 CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"transform"]; 2 anim.duration = 1; 3 4 CATransform3D form = CATransform3DMakeTranslation(350, 350, 0); 5 anim.toValue = [NSValue valueWithCATransform3D:form]; 6 7 [_myView.layer addAnimation:anim forKey:nil];
  • 通過CALayer的transform屬性實現平移動畫,layer會從自己的初始位置平移到(350, 350)位置
  • 通過transform(KVC)的方式來進行設置,可以簡單實現3D效果的平移、縮放、旋轉效果。
  • 可查看API文檔搜索CABasicAnimation animationWithKeyPath Types

縮放動畫(1)

1 CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"bounds"]; 2 anim.duration = 2; 3 4 anim.toValue = [NSValue valueWithCGRect:CGRectMake(0, 0, 30, 30)]; 5 6 [_myView.layer addAnimation:anim forKey:nil];

通過CALayer的bounds屬性實現縮放動畫,layer會從原來的尺寸(100x100)變為30x30

縮放動畫(2)

1 CABasicAnimation *anim = [CABasicAnimation 2 animationWithKeyPath:@"transform"]; 3 anim.duration = 1.5; // 動畫持續1.5s 4 5 // CALayer的寬度從0.5倍變為2倍 6 // CALayer的高度從0.5倍變為1.5倍 7 anim.fromValue = [NSValue valueWithCATransform3D:CATransform3DMakeScale(0.5, 0.5, 1)]; 8 anim.toValue = [NSValue valueWithCATransform3D:CATransform3DMakeScale(2, 1.5, 1)]; 9 10 [_myView.layer addAnimation:anim forKey:nil];

旋轉動畫

1 CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"transform"]; 2 anim.duration = 1.5; 3 4 // 繞著(1, 1, 0)這個向量軸順時針旋轉45° 5 anim.toValue = [NSValue valueWithCATransform3D:CATransform3DMakeRotation(M_PI_4, 1, 1, 0)]; 6 7 [_myView.layer addAnimation:anim forKey:nil];
  • 提示:如果要僅需要圖形以2D的方式旋轉,只要把CATransform3DMakeRotation在z方向上的值改為1即可。

    anima.toValue=[NSValue valueWithCATransform3D:CATransform3DMakeRotation(M_PI_4, 1, 1, 0)];

  • 通過以上可以發現其實可以不用設置fromValue,只設置了toValue
  • CABasicAnimation雖然能夠做很多基本的動畫效果,但是有個局限性,只能讓CALayer的屬性從某個值漸變到另一個值,僅僅是在2個值之間漸變

?

轉載于:https://www.cnblogs.com/xs514521/p/5192378.html

總結

以上是生活随笔為你收集整理的之一:CABasicAnimation - 基本动画的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。