(1)UIImageView 的動畫操作倡缠,來自定義循環(huán)播放動畫(不建議使用萌抵,內(nèi)存消耗大)
(2)CADisplayLink 是一個計時器棍丐,但是同 NSTimer 不同的是渠牲,CADisplayLink 的刷新周期同屏幕完全一致。
例如在 iOS 中屏幕刷新周期是60次/秒泌参,CADisplayLink 刷新周期同屏幕刷新一致也是60次/秒竭业,這樣一來使用它完成的逐幀動畫(又稱為“時鐘動畫”)完全感覺不到動畫的停滯情況。
關(guān)鍵操作:
效果如下:
ViewController.h
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController
@property (strong, nonatomic) UIImageView *imgVAnimation;
@property (strong, nonatomic) CADisplayLink *displayLink;
@end
#import "ViewController.h"
@interface ViewController ()
- (void)layoutUI;
- (void)changeImage;
- (void)layoutUINoSuggest;
- (NSArray *)imagesFromGroups;
- (NSArray *)imagesFromFolderReferences;
@end
@implementation ViewController
#define kImgCount 29
- (void)viewDidLoad {
[super viewDidLoad];
//[self layoutUINoSuggest];
[self layoutUI];
}
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
//開始動畫及舍;對應(yīng)使用[self layoutUINoSuggest]的情況
//[_imgVAnimation startAnimating];
//實(shí)例化時鐘對象
_displayLink=[CADisplayLink displayLinkWithTarget:self selector:@selector(changeImage)];
//添加時鐘對象實(shí)例到主運(yùn)行循環(huán)
[_displayLink addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
}
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
//停止動畫未辆;對應(yīng)使用[self layoutUINoSuggest]的情況
//[_imgVAnimation stopAnimating];
//從主運(yùn)行循環(huán)移除時鐘對象實(shí)例
[_displayLink removeFromRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
#pragma mark - 推薦使用的方式
/**
* 使用CADisplayLink,來自定義循環(huán)播放動畫(推薦使用锯玛,內(nèi)存消耗小)
* CADisplayLink是一個計時器咐柜,但是同NSTimer不同的是,CADisplayLink的刷新周期同屏幕完全一致攘残。例如在iOS中屏幕刷新周期是60次/秒拙友,CADisplayLink刷新周期同屏幕刷新一致也是60次/秒,這樣一來使用它完成的逐幀動畫(又稱為“時鐘動畫”)完全感覺不到動畫的停滯情況
*/
- (void)layoutUI {
_imgVAnimation = [[UIImageView alloc] initWithFrame:self.view.bounds];
[self.view addSubview:_imgVAnimation];
}
- (void)changeImage {
//定義一個變量記錄執(zhí)行次數(shù)
static NSUInteger s=0;
static NSUInteger indexOfImg = 0;
//每秒執(zhí)行12次if內(nèi)的語句歼郭;分別當(dāng)s=5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60...
s++;
if (s % 5 == 0) {
UIImage *image=[self imagesFromGroups][indexOfImg];
_imgVAnimation.layer.contents=(id)image.CGImage; //更新圖片
indexOfImg++;
if (indexOfImg == kImgCount) {
indexOfImg = 0;
}
}
}
#pragma mark - 不建議使用的方式
/**
* 使用圖片視圖的動畫操作遗契,來自定義循環(huán)播放動畫(不建議使用,內(nèi)存消耗大)
*/
- (void)layoutUINoSuggest {
_imgVAnimation = [[UIImageView alloc] initWithFrame:self.view.bounds];
_imgVAnimation.animationImages = [self imagesFromGroups]; //引用圖片數(shù)組病曾,導(dǎo)致一次性加載圖片數(shù)組牍蜂,內(nèi)存消耗大
//設(shè)置動畫持續(xù)時間(圖片播放周期時間,而不是播放一張圖片的時間)泰涂;單位為秒鲫竞;默認(rèn)值為每秒30幀(每秒播放30張圖片)
_imgVAnimation.animationDuration = 3;
//設(shè)置動畫播放重復(fù)次數(shù);默認(rèn)值為0逼蒙,表示無限循環(huán)
_imgVAnimation.animationRepeatCount = 0;
[self.view addSubview:_imgVAnimation];
}
#pragma mark - 讀取圖片文件數(shù)組操作
/**
* 獲取來自分組(黃色文件夾)的圖片數(shù)組从绘;圖片文件路徑不需要包含文件夾
* 使用右鍵“Add Files to...”->“Added folders” : “Create groups”,生成分組(黃色文件夾)
*
* @return 來自分組(黃色文件夾)的圖片數(shù)組
*/
- (NSArray *)imagesFromGroups {
NSMutableArray *mArrImgForAnimation = [[NSMutableArray alloc] initWithCapacity:kImgCount];
NSString *strImgName;
for (NSUInteger i=0; i<kImgCount; i++) {
strImgName = [NSString stringWithFormat:(i<10 ? @"Happy000%lu" : @"Happy00%lu")
, (unsigned long)i];
//[mArrImgForAnimation addObject:[UIImage imageNamed:strImgName]]; //[UIImage imageNamed:strImgName]會緩存圖片是牢,這里圖片多僵井,占內(nèi)存過大,不建議用
//讀取方式一(推薦使用):
NSString *path = [[NSBundle mainBundle] pathForResource:strImgName ofType:@"jpg"];
//NSString *path = [[NSBundle mainBundle] pathForResource:strImgName ofType:nil]; //這種方式的話驳棱,strImgName的格式就為“xx.jpg”
//讀取方式二:
//NSString *path = [[[NSBundle mainBundle] bundlePath] stringByAppendingPathComponent:strImgName];
//為數(shù)組mArrImgForAnimation添加數(shù)組元素
[mArrImgForAnimation addObject:[UIImage imageWithContentsOfFile:path]]; //雖然沒緩存圖片批什,但也可能存在內(nèi)存泄露問題
}
return mArrImgForAnimation;
}
/**
* 獲取來自文件夾引用(藍(lán)色文件夾)的圖片數(shù)組;圖片文件路徑需要包含文件夾
* 使用右鍵“Add Files to...”->“Added folders” : “Create folder references”蹈胡,生成文件夾引用(藍(lán)色文件夾)
*
* @return 來自文件夾引用(藍(lán)色文件夾)的圖片數(shù)組
*/
- (NSArray *)imagesFromFolderReferences {
NSMutableArray *mArrImgForAnimation = [[NSMutableArray alloc] initWithCapacity:kImgCount];
NSString *strImgName;
for (NSUInteger i=0; i<kImgCount; i++) {
strImgName = [NSString stringWithFormat:(i<10 ? @"Happy000%lu" : @"Happy00%lu")
, (unsigned long)i];
//讀取方式一(推薦使用):
NSString *path = [[NSBundle mainBundle] pathForResource:strImgName ofType:@"jpg" inDirectory:@"TomCat"];
//NSString *path = [[NSBundle mainBundle] pathForResource:strImgName ofType:nil inDirectory:@"TomCat"]; //這種方式的話渊季,strImgName的格式就為“xx.jpg”
//讀取方式二:
//NSString *bundlePath = [[[NSBundle mainBundle] bundlePath] stringByAppendingPathComponent:@"TomCat"];
//NSString *path = [bundlePath stringByAppendingPathComponent:strImgName];
//為數(shù)組mArrImgForAnimation添加數(shù)組元素
[mArrImgForAnimation addObject:[UIImage imageWithContentsOfFile:path]]; //雖然沒緩存圖片,但也可能存在內(nèi)存泄露問題
}
return mArrImgForAnimation;
}
@end