W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
有時(shí)候?qū)τ趇OS應(yīng)用程序來(lái)說(shuō),希望能通過(guò)屬性動(dòng)畫來(lái)對(duì)比較難做動(dòng)畫的布局進(jìn)行一些改變。比如交換一段文本和圖片,或者用一段網(wǎng)格視圖來(lái)替換,等等。屬性動(dòng)畫只對(duì)圖層的可動(dòng)畫屬性起作用,所以如果要改變一個(gè)不能動(dòng)畫的屬性(比如圖片),或者從層級(jí)關(guān)系中添加或者移除圖層,屬性動(dòng)畫將不起作用。
于是就有了過(guò)渡的概念。過(guò)渡并不像屬性動(dòng)畫那樣平滑地在兩個(gè)值之間做動(dòng)畫,而是影響到整個(gè)圖層的變化。過(guò)渡動(dòng)畫首先展示之前的圖層外觀,然后通過(guò)一個(gè)交換過(guò)渡到新的外觀。
為了創(chuàng)建一個(gè)過(guò)渡動(dòng)畫,我們將使用CATransition
,同樣是另一個(gè)CAAnimation
的子類,和別的子類不同,CATransition
有一個(gè)type
和subtype
來(lái)標(biāo)識(shí)變換效果。type
屬性是一個(gè)NSString
類型,可以被設(shè)置成如下類型:
kCATransitionFade
kCATransitionMoveIn
kCATransitionPush
kCATransitionReveal
到目前為止你只能使用上述四種類型,但你可以通過(guò)一些別的方法來(lái)自定義過(guò)渡效果,后續(xù)會(huì)詳細(xì)介紹。
默認(rèn)的過(guò)渡類型是kCATransitionFade
,當(dāng)你在改變圖層屬性之后,就創(chuàng)建了一個(gè)平滑的淡入淡出效果。
我們?cè)诘谄哒碌睦又芯鸵呀?jīng)用到過(guò)kCATransitionPush
,它創(chuàng)建了一個(gè)新的圖層,從邊緣的一側(cè)滑動(dòng)進(jìn)來(lái),把舊圖層從另一側(cè)推出去的效果。
kCATransitionMoveIn
和kCATransitionReveal
與kCATransitionPush
類似,都實(shí)現(xiàn)了一個(gè)定向滑動(dòng)的動(dòng)畫,但是有一些細(xì)微的不同,kCATransitionMoveIn
從頂部滑動(dòng)進(jìn)入,但不像推送動(dòng)畫那樣把老土層推走,然而kCATransitionReveal
把原始的圖層滑動(dòng)出去來(lái)顯示新的外觀,而不是把新的圖層滑動(dòng)進(jìn)入。
后面三種過(guò)渡類型都有一個(gè)默認(rèn)的動(dòng)畫方向,它們都從左側(cè)滑入,但是你可以通過(guò)subtype
來(lái)控制它們的方向,提供了如下四種類型:
kCATransitionFromRight
kCATransitionFromLeft
kCATransitionFromTop
kCATransitionFromBottom
一個(gè)簡(jiǎn)單的用CATransition
來(lái)對(duì)非動(dòng)畫屬性做動(dòng)畫的例子如清單8.11所示,這里我們對(duì)UIImage
的image
屬性做修改,但是隱式動(dòng)畫或者CAPropertyAnimation
都不能對(duì)它做動(dòng)畫,因?yàn)镃ore Animation不知道如何在插圖圖片。通過(guò)對(duì)圖層應(yīng)用一個(gè)淡入淡出的過(guò)渡,我們可以忽略它的內(nèi)容來(lái)做平滑動(dòng)畫(圖8.4),我們來(lái)嘗試修改過(guò)渡的type
常量來(lái)觀察其它效果。
清單8.11 使用CATransition
來(lái)對(duì)UIImageView
做動(dòng)畫
@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
你可以從代碼中看出,過(guò)渡動(dòng)畫和之前的屬性動(dòng)畫或者動(dòng)畫組添加到圖層上的方式一致,都是通過(guò)-addAnimation:forKey:
方法。但是和屬性動(dòng)畫不同的是,對(duì)指定的圖層一次只能使用一次CATransition
,因此,無(wú)論你對(duì)動(dòng)畫的鍵設(shè)置什么值,過(guò)渡動(dòng)畫都會(huì)對(duì)它的鍵設(shè)置成“transition”,也就是常量kCATransition
。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: