你好,歡迎來到IOS教程網

 Ios教程網 >> IOS訊息 >> 關於IOS >> iOS開發學習之簡單動畫

iOS開發學習之簡單動畫

編輯:關於IOS

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];         }];     }      }
  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved