UIActivityIndicatorView
UIImageView的序列幀動畫 UIView動畫 時鐘動畫 一、UIActivityIndicatorView 1⃣️屬性 -isAnimating屬性判斷是否正在動畫 2⃣️第三方庫SVProgressHUD [SVProgressHUD dismiss] [SVProgressHUD showWithStatus:@“網絡加載中” maskType:SVProgressHUDMashTypeGradient];(後面的參數是否遮擋,可以不用) 3⃣️NSTimer [NSTimer scheduledTimerWithTimeInterval:1 target:2 selector:3 userInfo:4 repeats:5]; 1.時間間隔 2.self 3.觸發時調用的方法 4.用戶信息 5.是否重復 [timer invalidate]; 復制代碼 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { // 使用了SVProgress的maskType屬性,當前視圖無法接受觸摸事件 // 需要想辦法關閉 // 使用NSTimer if ([_indicatorView isAnimating]) { [SVProgressHUD dismiss]; [_indicatorView stopAnimating]; } else { [SVProgressHUD showWithStatus:@"等會~~~" maskType:SVProgressHUDMaskTypeGradient]; // 指示器一啟動,就無法交互了,要把時鐘放在這裡 [_indicatorView startAnimating]; [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(updateTimer:) userInfo:nil repeats:NO]; } } // NSTimer調用方法的參數,只能是NSTimer,使用參數,在當前示例中,就不需要使用成員變量了 - (void)updateTimer:(NSTimer *)timer { [SVProgressHUD dismiss]; [_indicatorView stopAnimating]; // 關閉時鐘 [timer invalidate]; } 復制代碼 二、UIImageView的序列幀動畫 1⃣️屬性說明 -animationImages:要顯示的一組圖盤 -animationDuration:顯示所有圖片需要的時間(如果中間由修改速度,需要先停止、設置、開始) -animationRepeatCount:動畫的執行次數 2⃣️相關方法 --(void)startAnimating; --(void)stopAnimating --(void)isAnimating; 1.趙雲動畫 復制代碼 // 創建趙雲的序列幀動畫 - (void)createZhaoyunImage { // Do any additional setup after loading the view, typically from a nib. // 設置ImageView的序列幀動畫 // 1. 需要一個數組 NSMutableArray *images = [NSMutableArray array]; for (int i = 1; i < 11; i++) { NSString *fileName = [NSString stringWithFormat:@"/images/zy/%d.png", i]; UIImage *image = [UIImage imageNamed:fileName]; [images addObject:image]; } [_zhaoyunImage setImage:images[0]]; // 設置圖像數組 [_zhaoyunImage setAnimationImages:images]; // 設置10張圖片播放的時長 [_zhaoyunImage setAnimationDuration:1.0f]; // 開始動畫 [_zhaoyunImage startAnimating]; } - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { if ([_zhaoyunImage isAnimating]) { // 序列幀動畫每次停止的時候,都會顯示設置的圖像,而不是當前播放到的圖像 [_zhaoyunImage stopAnimating]; } else { [_zhaoyunImage startAnimating]; } } 復制代碼 2.燕子動畫 復制代碼 #pragma mark - 拖拽燕子 - (void)dragBird:(UIPanGestureRecognizer *)sender { // 先需要知道手指的位置 CGPoint location = [sender locationInView:self.view]; // 手勢狀態改是UIGestureRecognizerStateChanged的時候,手指還沒有離開屏幕 // 這個時候,可以修改鳥的位置,同時讓鳥撲騰 if (sender.state == UIGestureRecognizerStateChanged) { // 注意:如果要修改播放中的序列幀動畫 // 1. 需要先停止動畫 [_birdImage stopAnimating]; // 2. 修改動畫頻率 [_birdImage setAnimationDuration:0.2f]; // 3. 重新啟動動畫 [_birdImage startAnimating]; // 修改燕子的動畫頻率 // 設置燕子的位置 [_birdImage setCenter:location]; } else if (sender.state == UIGestureRecognizerStateEnded) { // 恢復燕子慢悠悠 // 1. 需要先停止動畫 [_birdImage stopAnimating]; // 2. 修改動畫頻率 [_birdImage setAnimationDuration:1.2f]; // 3. 重新啟動動畫 [_birdImage startAnimating]; } } // 設置燕子的序列幀動畫,並設置燕子的拖拽手勢監聽 - (void)createBirdImage { // 設置燕子的序列幀動畫 NSArray *images = @[[UIImage imageNamed:@"/images/素材/燕子1.png"], [UIImage imageNamed:@"/images/素材/燕子2.png"]]; [_birdImage setAnimationImages:images]; [_birdImage setAnimationDuration:1.2f]; [_birdImage startAnimating]; // 定義手勢 UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(dragBird:)]; [_birdImage addGestureRecognizer:pan]; // 設置燕子圖片允許用戶交互 [_birdImage setUserInteractionEnabled:YES]; } 復制代碼 三、UIView動畫 四、時鐘動畫(CADisplayLink) -是一種以屏幕刷新屏幕觸發的時鐘機制,每秒鐘執行大約60次 -倒入QuartzCore框架 1⃣️使用方法 -定義CADisplayLink並制定觸發調用方法 -將顯示鏈接添加到主運行循環隊列 2⃣️兩種判斷時間間隔的方法 -以成員變量的方式判斷 -以全局變量的方式判斷 復制代碼 @interface ViewController () { // 游戲時鐘 CADisplayLink *_gameTimer; // 時鐘觸發的初始時間 CFTimeInterval _startTime; } @end @implementation ViewController #pragma mark - 使用指定時間處理CADisplayLink觸發時間的方法(1) - (void)updateTimer:(CADisplayLink *)sender { // 如果_startTime=0,說明是第一次觸發時鐘,需要記錄時鐘的時鐘戳記 if (_startTime == 0) { _startTime = sender.timestamp; } // 時鐘觸發的時間差值 CFTimeInterval deltaTime = sender.timestamp - _startTime; if (deltaTime > 1.0) { NSLog(@"時鐘觸發了 %f", sender.timestamp); // 更新_startTime的數值,記錄本次執行任務的時間 _startTime = sender.timestamp; } } #pragma mark - 使用指定時間處理CADisplayLink觸發時間的方法(2) - (void)step { // 假定每隔一秒觸發一次方法 if (steps % (10 * 60 * 60) == 1) { NSLog(@"時鐘觸發了! %ld", steps); } steps++; } - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. // 首先將啟動的時間點設置為0 _startTime = 0.0f; // 將屏幕刷新總次數設置為0 steps = 0; // 初始化游戲時鐘 _gameTimer = [CADisplayLink displayLinkWithTarget:self selector:@selector(step)]; // 初始化時鐘之後,有一個必須要做的,就是把游戲時鐘,添加到主運行循環 [_gameTimer addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode]; } 復制代碼 3⃣️使用步驟 方法1: -初始化一個游戲時鐘,並且加入主隊列中 -自己制定時間間隔,去執行操作 1.需要一個成員變量,記錄時鐘起始的“時間點”:CFTimeInterval _startTime; 2.計算成員變量去與時鐘觸發時的時間差,如果大於制定的時間差,再去執行操作 方法2: -定義一個全局的每秒中執行的次數 -如果執行了這個次數,就執行要執行的操作 復制代碼 steps = 0; // 初始化雪花圖像 _snowImage = [UIImage imageNamed:@"/images/素材/雪花"]; // 初始化時鐘 _gameTimer = [CADisplayLink displayLinkWithTarget:self selector:@selector(step)]; [_gameTimer addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode]; 復制代碼 復制代碼 #pragma mark - 時鐘處理方法 - (void)step { // 假設每秒鐘繪制6個雪花 if (steps % 10 == 0) { // 繪制雪花 UIImageView *imageView = [[UIImageView alloc]initWithImage:_snowImage]; // 指定雪花出現的位置 CGPoint startPoint = CGPointMake(arc4random() % 320, -30.0); // 指定雪花結束的位置 CGPoint endPoint = CGPointMake(arc4random() % 320, 490); /** 新問題 1. 雪花太大 2. 雪花太亮,需要改一下透明度 3. 如果雪花會轉就更好了 */ CGFloat r = arc4random() % 5 + 10; [imageView setFrame:CGRectMake(0, 0, r, r)]; // 設置起始點 [imageView setCenter:startPoint]; // 把雪花圖像添加到視圖 [self.view addSubview:imageView]; [UIView animateWithDuration:6.0f delay:0.0f options:UIViewAnimationOptionCurveEaseIn animations:^{ [imageView setCenter:endPoint]; [imageView setAlpha:0.2f]; [imageView setTransform:CGAffineTransformMakeRotation(M_PI)]; } completion:^(BOOL finished) { // 從父視圖刪除,這個千萬不要忘了 [imageView removeFromSuperview]; }]; } }