8.3 過渡

2018-02-24 15:07 更新

過渡

有時(shí)候?qū)τ趇OS應(yīng)用程序來說,希望能通過屬性動畫來對比較難做動畫的布局進(jìn)行一些改變。比如交換一段文本和圖片,或者用一段網(wǎng)格視圖來替換,等等。屬性動畫只對圖層的可動畫屬性起作用,所以如果要改變一個不能動畫的屬性(比如圖片),或者從層級關(guān)系中添加或者移除圖層,屬性動畫將不起作用。

于是就有了過渡的概念。過渡并不像屬性動畫那樣平滑地在兩個值之間做動畫,而是影響到整個圖層的變化。過渡動畫首先展示之前的圖層外觀,然后通過一個交換過渡到新的外觀。

為了創(chuàng)建一個過渡動畫,我們將使用CATransition,同樣是另一個CAAnimation的子類,和別的子類不同,CATransition有一個typesubtype來標(biāo)識變換效果。type屬性是一個NSString類型,可以被設(shè)置成如下類型:

kCATransitionFade 
kCATransitionMoveIn 
kCATransitionPush 
kCATransitionReveal

到目前為止你只能使用上述四種類型,但你可以通過一些別的方法來自定義過渡效果,后續(xù)會詳細(xì)介紹。

默認(rèn)的過渡類型是kCATransitionFade,當(dāng)你在改變圖層屬性之后,就創(chuàng)建了一個平滑的淡入淡出效果。

我們在第七章的例子中就已經(jīng)用到過kCATransitionPush,它創(chuàng)建了一個新的圖層,從邊緣的一側(cè)滑動進(jìn)來,把舊圖層從另一側(cè)推出去的效果。

kCATransitionMoveInkCATransitionRevealkCATransitionPush類似,都實(shí)現(xiàn)了一個定向滑動的動畫,但是有一些細(xì)微的不同,kCATransitionMoveIn從頂部滑動進(jìn)入,但不像推送動畫那樣把老土層推走,然而kCATransitionReveal把原始的圖層滑動出去來顯示新的外觀,而不是把新的圖層滑動進(jìn)入。

后面三種過渡類型都有一個默認(rèn)的動畫方向,它們都從左側(cè)滑入,但是你可以通過subtype來控制它們的方向,提供了如下四種類型:

kCATransitionFromRight 
kCATransitionFromLeft 
kCATransitionFromTop 
kCATransitionFromBottom

一個簡單的用CATransition來對非動畫屬性做動畫的例子如清單8.11所示,這里我們對UIImageimage屬性做修改,但是隱式動畫或者CAPropertyAnimation都不能對它做動畫,因?yàn)镃ore Animation不知道如何在插圖圖片。通過對圖層應(yīng)用一個淡入淡出的過渡,我們可以忽略它的內(nèi)容來做平滑動畫(圖8.4),我們來嘗試修改過渡的type常量來觀察其它效果。

清單8.11 使用CATransition來對UIImageView做動畫

@interface ViewController ()

@property (nonatomic, weak) IBOutlet UIImageView *imageView;
@property (nonatomic, copy) NSArray *images;

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    //set up images
    self.images = @[[UIImage imageNamed:@"Anchor.png"],
                    [UIImage imageNamed:@"Cone.png"],
                    [UIImage imageNamed:@"Igloo.png"],
                    [UIImage imageNamed:@"Spaceship.png"]];
}

- (IBAction)switchImage
{
    //set up crossfade transition
    CATransition *transition = [CATransition animation];
    transition.type = kCATransitionFade;
    //apply transition to imageview backing layer
    [self.imageView.layer addAnimation:transition forKey:nil];
    //cycle to next image
    UIImage *currentImage = self.imageView.image;
    NSUInteger index = [self.images indexOfObject:currentImage];
    index = (index + 1) % [self.images count];
    self.imageView.image = self.images[index];
}

@end

你可以從代碼中看出,過渡動畫和之前的屬性動畫或者動畫組添加到圖層上的方式一致,都是通過-addAnimation:forKey:方法。但是和屬性動畫不同的是,對指定的圖層一次只能使用一次CATransition,因此,無論你對動畫的鍵設(shè)置什么值,過渡動畫都會對它的鍵設(shè)置成“transition”,也就是常量kCATransition

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號