可以玩的UI-iOS互動式動畫
本篇通過一個例子演示CABasicAnimation 的使用,及互動式動畫的實現原理。
首先看下最終完成的效果:
頭像由矩形動畫變成圓形,整個過程可以用手指移動來控制,我們一步一步來實現它,let's GO!
首先例項一個頭像 layer:
float w = 120.0;
self.headerLayer = [CALayer layer];
self.headerLayer.frame = CGRectMake(0, 0, w, w);
self.headerLayer.position = CGPointMake((200 - w) / 2, (200 - w) / 2);
self.headerLayer.anchorPoint = CGPointMake(0, 0.5);
self.headerLayer.contents = (__bridge id)[UIImage imageNamed:@"head.jpg"].CGImage;
self.headerLayer.masksToBounds = YES;
self.headerLayer.cornerRadius = 0.0;
[self.containerView.layer addSublayer:self.headerLayer];
在這裡,裁剪圓角主要用 cornerRadius 來完成,初始化為沒有圓角。
接下來設定動畫,在動畫之前,先讓動畫暫停,否則動畫設定完後會自動播放:
self.headerLayer.speed = 0.0;
由於我們的動畫包含圓角變換,並沿著y軸平移,這兩個動畫都要在平移手勢的控制之下,我們使用組合動畫的方式來實現:
CABasicAnimation *animation = [CABasicAnimation animation];
animation.keyPath = @"cornerRadius";
animation.toValue = @(w / 2);
animation.duration = 1.0;
CABasicAnimation *positionAnimation = [CABasicAnimation animationWithKeyPath:@"position.y"];
positionAnimation.toValue = @(self.headerLayer.position.y - w);
positionAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn];
CAAnimationGroup *animaGroup = [CAAnimationGroup animation];
animaGroup.duration = 2.0f;
animaGroup.fillMode = kCAFillModeForwards;
animaGroup.removedOnCompletion = NO;
animaGroup.animations = @[animation, positionAnimation];
[self.headerLayer addAnimation:animaGroup forKey:@"Animation"];
最後我們設定手勢的處理:
- (void)pan:(UIPanGestureRecognizer *)pan
{
CGFloat x = [pan translationInView:self.view].x;
x /= 200.0f;
CFTimeInterval timeOffset = self.headerLayer.timeOffset;
timeOffset = MIN(0.999, MAX(0.0, timeOffset - x));
self.headerLayer.timeOffset = timeOffset;
self.titleLabel.layer.timeOffset = timeOffset;
[pan setTranslation:CGPointZero inView:self.view];
}
手動互動的關鍵是控制 layer 的 timeOffset,它可以控制當前動畫執行的時間偏移量,範圍在0~1之間,所以我們要將移動手勢的位置和動畫的時間點做一個換算。另外注意將手勢重置,以保證每次能獲得相對於上一次的偏移位置(x)。
相關文章
- objc系列譯文(12.6):互動式動畫OBJ動畫
- 互動式動畫設計工具Principle中文版動畫
- 《劍網3:指尖江湖》打造可以玩的動畫片,開啟沉浸式遊戲體驗動畫遊戲
- 【動畫進階】極具創意的滑鼠互動動畫動畫
- 這是一篇很好的互動式文章,Framer Motion 佈局動畫動畫
- Mac動畫互動設計軟體Mac動畫
- Flare動畫進階——建立可互動的一拳超人動畫動畫
- Flutter學習之佈局、互動、動畫Flutter動畫
- Principle for Mac(動畫互動設計軟體)Mac動畫
- RecyclerView 之使用 ItemTouchHelper 實現互動動畫View動畫
- 淺析mysql互動式連線&非互動式連線MySql
- 互動式指令碼指令碼
- 【譯】使用者與Flutter互動時的粒子動畫Flutter動畫
- Flutter學習指南:互動、手勢和動畫Flutter動畫
- CoreGraphics,CoreAnimation實戰, 可互動動畫圖表動畫
- 分散式事務,原來可以這麼玩?分散式
- 互動投影+沉浸式互動投影綜合解決方案
- 超實用!7 個優秀的 UI 互動動畫技巧UI動畫
- 12個創新的網頁介面互動和動畫效果網頁動畫
- 未成年人玩抖音直播間的互動遊戲,算不算玩遊戲?遊戲
- 《每週一點canvas動畫》——使用者互動Canvas動畫
- Axure RP 9 互動動畫原型設計工具 for Mac動畫原型Mac
- 互動式UI設計指南UI
- 關於緩動動畫函式的封裝動畫函式封裝
- 智慧動畫互動設計:Principle mac免啟用版動畫Mac
- .NET 實現的互動式 OA 系統
- 強大的動畫互動設計:Principle免啟用最新版動畫
- 實現達到 60FPS 的高效能互動動畫動畫
- 區塊鏈系統可以實現資料的互動需求區塊鏈
- 沉浸式互動讓遊戲更加迷人遊戲
- HTML 互動式表單驗證HTML
- PsySH——PHP互動式控制檯PHP
- Flutter 實現底部擴散模糊動畫(二)頁面互動Flutter動畫
- 直播系統中可以具備哪些互動性功能?
- 動畫函式的繪製及自定義動畫函式動畫函式
- 互動式資料視覺化的優勢視覺化
- Laravel 的命令版 Siri — 互動式生成命令Laravel
- 為大資料帶來互動式的BI大資料