W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗(yàn)值獎勵
有時(shí)候?qū)τ趇OS應(yīng)用程序來說,希望能通過屬性動畫來對比較難做動畫的布局進(jìn)行一些改變。比如交換一段文本和圖片,或者用一段網(wǎng)格視圖來替換,等等。屬性動畫只對圖層的可動畫屬性起作用,所以如果要改變一個不能動畫的屬性(比如圖片),或者從層級關(guān)系中添加或者移除圖層,屬性動畫將不起作用。
于是就有了過渡的概念。過渡并不像屬性動畫那樣平滑地在兩個值之間做動畫,而是影響到整個圖層的變化。過渡動畫首先展示之前的圖層外觀,然后通過一個交換過渡到新的外觀。
為了創(chuàng)建一個過渡動畫,我們將使用CATransition
,同樣是另一個CAAnimation
的子類,和別的子類不同,CATransition
有一個type
和subtype
來標(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è)推出去的效果。
kCATransitionMoveIn
和kCATransitionReveal
與kCATransitionPush
類似,都實(shí)現(xiàn)了一個定向滑動的動畫,但是有一些細(xì)微的不同,kCATransitionMoveIn
從頂部滑動進(jìn)入,但不像推送動畫那樣把老土層推走,然而kCATransitionReveal
把原始的圖層滑動出去來顯示新的外觀,而不是把新的圖層滑動進(jìn)入。
后面三種過渡類型都有一個默認(rèn)的動畫方向,它們都從左側(cè)滑入,但是你可以通過subtype
來控制它們的方向,提供了如下四種類型:
kCATransitionFromRight
kCATransitionFromLeft
kCATransitionFromTop
kCATransitionFromBottom
一個簡單的用CATransition
來對非動畫屬性做動畫的例子如清單8.11所示,這里我們對UIImage
的image
屬性做修改,但是隱式動畫或者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
。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: