動(dòng)畫效果:
對(duì)動(dòng)畫作如下分析(這個(gè)分析方案肯定不是唯一和最優(yōu)的实柠,其實(shí)實(shí)現(xiàn)這個(gè)動(dòng)畫效果不難):
- 主界面是一個(gè)導(dǎo)航欄控制器,底部工具欄設(shè)置不隱藏善涨,在底部工具欄添加左下角的唱片按鈕
- 點(diǎn)擊左下角的唱片按鈕窒盐,在主界面addChildViewController
- 在子視圖控制器的視圖上疊加三個(gè)子視圖(上-導(dǎo)航欄,中-圓形唱片封面钢拧,下-操作按鈕)
- 設(shè)置子視圖出現(xiàn)時(shí)的動(dòng)畫(重載圖層的隱式動(dòng)畫)蟹漓,設(shè)置子視圖退出時(shí)的動(dòng)畫(添加顯示動(dòng)畫)
關(guān)鍵是第4步:
一 設(shè)置子視圖出現(xiàn)時(shí)的動(dòng)畫
子視圖出現(xiàn)的動(dòng)畫通過重載子視圖圖層的隱式動(dòng)畫來實(shí)現(xiàn),圖層行為觸發(fā)后(圖層添加到圖層樹或從圖層樹中移除源内,位置葡粒,透明度,寬高發(fā)生改變),圖層將會(huì)使用到以下幾種方式找到響應(yīng)圖層行為的對(duì)象(這個(gè)對(duì)象遵守CAAction協(xié)議嗽交,CALayer類提供默認(rèn)的CAAnimation的行為對(duì)象實(shí)例卿嘲,并應(yīng)用到圖層上):
- 圖層的actionForKey:方法被調(diào)用,并返回對(duì)應(yīng)key值的行為對(duì)象夫壁,若對(duì)應(yīng)key值的行為對(duì)象不存在拾枣,則返回nil。
- 如果圖層有遵守CALayerDelegate的類(例如:UIView)盒让,則代理方法actionForLayer:forKey:將被調(diào)用
- 在圖層actions字典中尋找對(duì)應(yīng)行為標(biāo)識(shí)符(key)的對(duì)象
上梅肤,中,下三個(gè)子視圖繼承自UIView, 所以可以實(shí)現(xiàn)CALayerDelegate的方法:
//示例 上(導(dǎo)航欄)視圖邑茄,KCAOnOrderIn行為在圖層被添加或hidden設(shè)為NO時(shí)被觸發(fā)姨蝴,與相反是KCAOnOrderOut
-(id<CAAction>)actionForLayer:(CALayer *)layer forKey:(NSString *)event{
if([event isEqualToString:kCAOnOrderIn]){
CAKeyframeAnimation *animation = [CAKeyframeAnimation animation];
animation.keyPath = @"position";
animation.duration = 0.2;
animation.values = @[
[NSValue valueWithCGPoint:CGPointMake([UIScreen mainScreen].bounds.size.width/2, -52)],
[NSValue valueWithCGPoint:CGPointMake([UIScreen mainScreen].bounds.size.width/2, 42)],
[NSValue valueWithCGPoint:CGPointMake([UIScreen mainScreen].bounds.size.width/2, 32)],
];
return animation;
}
}
二 設(shè)置子視圖退出時(shí)的動(dòng)畫
原來想通過遵守CALayerDelegate協(xié)議,返回KCAOnOrderOut行為對(duì)象來實(shí)現(xiàn)撩扒,但暫時(shí)沒效果似扔。只能通過發(fā)送通知,在子視圖控制器被remove前發(fā)送通知搓谆,讓上中下視圖添加顯示動(dòng)畫來實(shí)現(xiàn)
-(void)disapperAnimation{
CAKeyframeAnimation *animation = [CAKeyframeAnimation animation];
animation.keyPath = @"position";
animation.duration = 0.2;
animation.delegate = self;
animation.values = @[
[NSValue valueWithCGPoint:CGPointMake([UIScreen mainScreen].bounds.size.width/2, 32)],
[NSValue valueWithCGPoint:CGPointMake([UIScreen mainScreen].bounds.size.width/2, 42)],
[NSValue valueWithCGPoint:CGPointMake([UIScreen mainScreen].bounds.size.width/2, -52)],
];
[self.layer addAnimation:animation forKey:nil];
}