[英]Animating UINavigationController's 'back' button
我在導航控制器的層次結構中的視圖控制器上有一個自定義按鈕,按下該按鈕會彈出可見的視圖控制器。
我想使用UIView的transform
屬性來動畫化視圖控制器的關閉。 它可以工作,但是如果我使用“ popViewControllerAnimated:YES”,動畫的默認左幻燈片仍然存在,盡管我的自定義轉換也可以工作。
如果我將popViewControllerAnimated:NO
設置為完全沒有動畫。
我還研究了使用CATransition
,當我將popViewControllerAnimated
設置為NO
,但是公共API中沒有“縮放”效果,因此我不想使用私有效果。 自定義過濾器也不適用於iPhone,僅適用於OSX。
所以我想我的問題是:
1)有沒有一種方法可以刪除默認過渡中的左側幻燈片,但仍然可以使用transform
獲得自定義動畫?
2)對CATransition
使用自定義過濾器的CATransition
?
3)如果我使用私有API來實現縮放效果,Apple將我的應用扔到拒絕箱中的可能性有多大?
有人有我忽略的解決方案嗎?
我已經完成了與您描述的類似的操作,即在UINavigationController中更改彈出和推送視圖的默認動畫。
這個想法是禁用對象的默認動畫並將其替換為您自己的動畫。 我為UINavigationController創建了一個新類別,並使用了類似於以下功能的函數。
- (void) altAnimatePopViewControllerAnimated:(BOOL)animated
{
[CATransaction begin];
CATransition *transition;
transition = [CATransition animation];
transition.type = kCATransitionPush; // Use any animation type and subtype you like
transition.subtype = kCATransitionFromTop;
transition.duration = 0.3;
CATransition *fadeTrans = [CATransition animation];
fadeTrans.type = kCATransitionFade;
fadeTrans.duration = 0.3;
[CATransaction setValue:(id)kCFBooleanTrue
forKey:kCATransactionDisableActions];
[[[[self.view subviews] objectAtIndex:0] layer] addAnimation:transition forKey:nil];
[[[[self.view subviews] objectAtIndex:1] layer] addAnimation:fadeTrans forKey:nil];
[self popViewControllerAnimated:YES];
[CATransaction commit];
}
使用只需使用代碼
[self.navigationController altAnimatePopViewControllerAnimated:YES];
為了進行推送,只需創建另一個類似的功能並反轉動畫即可。
這不是完美的,但可以。 當您選擇不同的動畫類型時,請在構成導航欄/控制器的不同子視圖中播放以使其完美。
花了我一個漂亮的白人來提出這個,所以明智地使用它:)
*******編輯
嘗試用此替換推送轉換(自己不要嘗試):
CAKeyframeAnimation *scale = [CAKeyframeAnimation animationWithKeyPath:@"transform.scale"];
scale.duration = duration;
scale.values = [NSArray arrayWithObjects:[NSNumber numberWithFloat:.5f],
[NSNumber numberWithFloat:1.2f],
[NSNumber numberWithFloat:.85f],
[NSNumber numberWithFloat:1.f],
nil];
這將彈出,即視圖將變大,然后再穩定到正確的大小。 播放數組中的值以控制動畫的曲線。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.