一. UIImageView實現動畫效果
UIImageView可以添加一組不同幀的圖片,來進行播放動畫效果.具體源碼如下方法所示:
// imageView使用懶加載方式進行初始化,在ViewDidLoad方法中將其添加在View上即可
- (UIImageView *)imageView {
if (!_imageView) {
// 初始化imageView設定其frame
_imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 200, 200)];
// 保存圖片的可變數據
NSMutableArray *imageArr = [[NSMutableArray alloc] init];
// 獲取圖片
for (int i = 1; i < 17; i++) {
// 獲取照片名稱
NSString *imageStr = [NSString stringWithFormat:@"gua%d.tiff",i];
// 獲取照片
UIImage *image = [UIImage imageNamed:imageStr];
// 添加到可變數組中
[imageArr addObject:image];
}
// 設置imageView的動畫組圖片
_imageView.animationImages = imageArr;
// 設置ImageView的動畫時長
_imageView.animationDuration = 0.5;
// 設置ImageView的動畫播放次數
_imageView.animationRepeatCount = 100;
// 開啟動畫
[_imageView startAnimating];
}
return _imageView;
}
二. UIView基礎動畫實現方式1
UIKit直接將動畫集成到UIView類中,當內部的一些屬性發生變化的改變的時候,UIView將為這些改變提供動畫支持
執行動畫的工作由UIView類自動完成,但仍希望在執行動畫時通知視圖,為此需要將屬性的代碼放在
[UIView beginAnimations:nil context:nil]與[UIView commitAnimations]之間.
例如:
// 開始設置UIView基礎動畫
[UIView beginAnimations:@"大小" context:nil];
// 設置動畫時長
[UIView setAnimationDuration:0.5];
// 設置動畫次數
[UIView setAnimationRepeatCount:5];
// 動畫反轉
[UIView setAnimationRepeatAutoreverses:YES];
// 改變redview的frame
self.redView.frame = CGRectMake(0, 0, kScreenWidth, kScreenHight);
// 確認動畫并開始
[UIView commitAnimations];
注意: UIView的基礎動畫設置代理之后,要實現兩個代理方法1.動畫即將開始;2.動畫結束.(此兩個代理方法需要手動填寫)
// 設置動畫的代理
[UIView setAnimationDelegate:self];
// 代理方法中動畫開始時的回調方法
[UIView setAnimationWillStartSelector:@selector(animationWillStart:context:)];
// 代理方法中動畫結束時的回調方法
[UIView setAnimationDidStopSelector:@selector(animationDidStop:context:)];
總結:
[UIView beginAnimations:nil context:nil];
// 設置UIView的動畫的屬性
[UIView commitAnimations];
三. UIView基礎動畫實現方式2
UIView的Block實現動畫是從iOS 4.0以后才支持的.
- Block簡單動畫
// Duration:為動畫的總時長
[UIView animateWithDuration:3 animations:^{
// 需要修改的屬性
} completion:^(BOOL finished) {
// 通過finished的值來進行判斷動畫是否停止
}];
- Block復雜動畫
// Duration:動畫總時長 delay:動畫的延遲播放時間 options:動畫的效果(例如:淡入,淡出,等)
[UIView animateWithDuration:(NSTimeInterval) delay:(NSTimeInterval) options:(UIViewAnimationOptions) animations:^{
// UIView需要修改的屬性
} completion:^(BOOL finished) {
// 通過finished的值來判斷動畫是否停止
}];
- Block關鍵幀動畫
// Duration:為動畫的總時長
// delay:為延遲播放的時間
// options:為可選項
// animations:需要執行的動畫
[UIView animateKeyframesWithDuration:4.0 delay:0.0 options:UIViewKeyframeAnimationOptionRepeat animations:^{
// StarTime:幀動畫開始的時間
// relativeDuration的時間為Duration的百分比,取值在0~1之間
[UIView addKeyframeWithRelativeStartTime:0.0 relativeDuration:0.25 animations:^{
}];
} completion:^(BOOL finished) {
// 判斷動畫是否結束
if (finished) {
}
}];
注意:UIView的addKeyframeWithRelativeStartTime:的方法必須實現在UIView的animateKeyframesWithDuration的animations的參數中.
- Spring動畫
Spring Animation是一種特殊的動畫曲線,自從iOS7開始被廣泛運用在系統動畫中.
[UIView animateWithDuration:4.0 // 動畫時長
delay:2.0 // 動畫延遲播放時間
usingSpringWithDamping:0.5 // 阻尼系數 0.0~1.0
initialSpringVelocity:40.0// 初始速度
options:UIViewAnimationOptionRepeat // 可選項,動畫播放方式
animations:^{
// 需要修改的屬性
} completion:^(BOOL finished) {
// 判斷動畫是否結束
if (finished) {
}
}];
- 總結
Block簡單動畫,Block復雜動畫,Block關鍵幀動畫與Spring動畫都是通過Block的閉包完成動畫的回調設置;Spring Animation是一種特殊的動畫曲線,自從iOS 7開始被廣泛運用.
四. CoreAnimation實現方式
- CoreAnimation簡介
CoreAnimation動畫位于iOS中的Media層
CoreAnimation動畫實現需要添加QuartzCore.Framework
CoreAnimation動畫實現基本都是Layer Animation
iOS系統層級劃分
Cocoa Touch--------UIKit
Media--------------Core Graphics,Open GL ES, Core Animation
Core Services--------Core Data, Foundation
Core OS
CALayer負責繪制,提供UIView需要展示的內容,不能交互.
UIView負責交互,顯示CALayer繪制內容.
CALayer(層)是屏幕上的一個矩形區域,在每一個UIView中都包含一個根CALayer,UIView上的所有視覺效果都是在這個Layer上進行的.
CALayer的外形特征包括.
- 尺寸的大小
- 背景色
- 內容 (可以填充圖片或者使用Core Graphics繪制的內容)
- 矩形是否有圓角
- 矩形是否有陰影
CALayer的常用屬性
1.cornerRadius 設置圓角
2.shadowColor 陰影顏色
3.shadowOffset 陰影偏移量
4.shadowRadius陰影模糊程度
5.shadowOpacity 陰影的透明度
6.anchorPoint 錨點 (錨點的中心點始終與position的中心點重合)
7.position 位置信息
8.borderWidth 描邊粗細
9.borderColor 描邊顏色
10.transform 使CALayer產生3D空間內的平移,縮放,旋轉等變化.
- CABasicAnimation
示例代碼:
CABasicAnimation *basic = [CABasicAnimation animationWithKeyPath:@"opacity"];
// 是原來的2PI倍
basic.byValue = @(2 * M_PI);
// 動畫時長
basic.duration = 4.0;
// 動畫重復次數
basic.repeatCount = 50;
// 添加動畫
// forkey為添加標記,刪除動畫的時候可以通過標記刪除.
[self.greenView.layer addAnimation:basic forKey:@"basic"];
- CAFrameAnimation
示例代碼:
CAKeyframeAnimation *keyFrame = [CAKeyframeAnimation animationWithKeyPath:@"position"];
// layer最初的position值
float position_x = self.greenView.layer.position.x;
float position_y = self.greenView.layer.position.y;
// layer向左晃動的偏移量
NSValue *leftValue = [NSValue valueWithCGPoint:CGPointMake(position_x - 20, position_y)];
// layer的原始位置
NSValue *originValue = [NSValue valueWithCGPoint:CGPointMake(position_x, position_y)];
// layer向右晃動的偏移量
NSValue *rightValue = [NSValue valueWithCGPoint:CGPointMake(position_x + 20, position_y)];
// 添加每一幀的value值(因為參數為對象類型,所以要將CGPoint類的對象轉化成為NSValue類型)
[keyFrame setValues:@[rightValue,originValue,leftValue]];
// 動畫播放次數
keyFrame.repeatCount = 40;
// 動畫的時長
keyFrame.repeatDuration = 100.0;
// 為layer層添加動畫
[self.greenView.layer addAnimation:keyFrame forKey:@"keyframe"];
CAAnimationGroup 組合動畫
創建一個組合動畫對象,可以將CABasicAnimation于CAFrameAnimation結合.通過設置CAAnimationGroup的重復次數,動畫時長來反映出組合動畫的效果.CASpringAnimation
簡單屬性:
1.mass 質量,值越大,彈簧拉伸與壓縮的幅度越大
2.stiffness 剛度系數
3.damping 阻尼系數
4.initialVelocity 初始速度
5.settlingDuration 動畫時長