簡介
在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封裝的方法,可是也簡單的實現了一個動畫效果。
以上就是本篇博客所有內容,歡迎指正和交流。轉載註明出處~