UIKit封裝的系統動畫

簡介


在UIKit中,對UIView封裝了不少類方法來進行簡單的動畫實現,在動畫過程當中,經過對屬性值的修改來完成一系列的效果。
在IOS4之前,主要經過
+ beginAnimation
+ setAnimationDuration:設置動畫時長
+ setAnimationDelay:設置延遲時間
+ setAnimationDelegate:設置代理

code..... 寫入一些屬性改變例如仿射變換,透明度等

+ commitAnimation

代理能夠監聽一些事件,好比動畫結束後,能夠調用代理方法進行一系列處理。

在IOS4之後,伴隨着Block語法,有了更好的方法
+ animateWithDuration:delay:options:animations:completion:

前兩個屬性前面見過,第三個屬性主要設置動畫的速度效果,好比漸入漸出(EaseInOut),勻速(Linear)等
animations後面是一個塊語法,設置動畫的相關效果。
completion後面也是一個塊語法,設置動畫完成後執行的代碼。

簡單的位移動畫


- (void)translateAnimation
{
    [UIView animateWithDuration:1
                          delay:1
                        options:UIViewAnimationOptionCurveEaseInOut
                     animations:^{
                         _imageView.center = CGPointMake(270, 410);
                     } completion:^(BOOL finished) {
                         NSLog(@"done");
                     }];
}

這個方法實現了經過設置屬性的位移動畫

咱們還能夠經過這個類方法對透明度,大小等等幾乎全部屬性進行改變增長動畫效果

增長仿射變換


- (void)transformAnimation
{
    [UIView animateWithDuration:3
                          delay:1
                        options:UIViewAnimationOptionCurveEaseIn
                     animations:^{
                         _imageView.center = CGPointMake(270, 410);
                         _imageView.transform = CGAffineTransformRotate(CGAffineTransformScale(_imageView.transform, 0.6, 0.6), M_PI);
                         _imageView.alpha = 0.0;
                     } completion:^(BOOL finished) {
                         NSLog(@"done");
                     }];
}

在這個方法中,對UIImageView的transform屬性設置進行了嵌套,在旋轉180度的同時進行了縮放。因爲設置了alpha,因此也還有一個漸漸消失的效果。
通常來講,若是經過設置alpha爲0後,須要從父視圖中remove掉這個對象。

利用completion設置連續動畫


- (void)transformAnimation
{
    [UIView animateWithDuration:3
                          delay:1
                        options:UIViewAnimationOptionCurveEaseIn
                     animations:^{
                         _imageView.center = CGPointMake(270, 410);
                         _imageView.transform = CGAffineTransformRotate(CGAffineTransformScale(_imageView.transform, 0.6, 0.6), M_PI);
                         _imageView.alpha = 0.0;
                     } completion:^(BOOL finished) {
                         NSLog(@"done");
                         [UIView animateWithDuration:3
                                               delay:0
                                             options:UIViewAnimationOptionCurveEaseIn
                                          animations:^{
                                              _imageView.center = CGPointMake(50, 50);
                                              _imageView.transform = CGAffineTransformIdentity;
                                              _imageView.alpha = 1.0;
                                          } completion:nil];
                     }];
}


咱們在上個方法的基礎上進行了修改,在completion中又加入了一個動畫效果,使這個圖片恢復到最初的狀態。
這裏面CGAffineTransformIdentity爲單位矩陣,是他的transform屬性回覆到原貌。

利用NSTimer完成連續動畫


咱們也可使用定時器來完成連續動畫效果

先增長兩個私有成員,而且能夠根據調試效果來設置_step初值

@interface ViewController ()
{
    NSTimer *_timer;
    NSInteger _step;
}

而後是方法

- (void)timerAnimation
{
    _timer = [NSTimer scheduledTimerWithTimeInterval:0.05
                                              target:self
                                            selector:@selector(animateWithTimer)
                                            userInfo:nil
                                             repeats:YES];
}

- (void)animateWithTimer
{
    if (_step == 0) {
        [_timer invalidate];
        [_imageView removeFromSuperview];
    }
    
    _imageView.transform = CGAffineTransformRotate(CGAffineTransformScale(_imageView.transform, 0.98, 0.98), ((10 * M_PI) / 180.0));
    _imageView.alpha *= 0.98;
    _step--;
}

雖然沒有使用UIView封裝的方法,可是也簡單的實現了一個動畫效果。



以上就是本篇博客所有內容,歡迎指正和交流。轉載註明出處~
相關文章
相關標籤/搜索