iOS 不使用UINavigationController實現Push動畫
阿新 • • 發佈:2019-02-16
轉自廖雪峰
在iOS開發中,如果使用UINavigationController,配合Storyboard+Push模式的Segue,預設情況下,可以直接實現左右推出的View切換效果。
但是,如果不使用UINavigationController時,把Segue設定為Push,執行就會直接報錯,而Model模式的Segue只有Cover Vertical,Flip Horizontal,Cross Dissolve和Partial Curl這4種模式,沒有Push模式。
如果要在自定義的View切換動畫中使用Push模式,唯一的方法是把Segue設定為Custom,然後自定義Push動畫。
自定義View切換動畫效果的實現方式是從UIStoryboardSegue派生一個類,然後在-(void)perform
方法中自己實現動畫。
經過多次Google,找到多種實現方式,經比較後發現,最簡單最靠譜的Push動畫實現如下:
- (void)perform
{
UIViewController* source = (UIViewController *)self.sourceViewController;
UIViewController* destination = (UIViewController *)self.destinationViewController ;
CGRect sourceFrame = source.view.frame;
sourceFrame.origin.x = -sourceFrame.size.width;
CGRect destFrame = destination.view.frame;
destFrame.origin.x = destination.view.frame.size.width;
destination.view.frame = destFrame;
destFrame.origin.x = 0;
[source.view.superview addSubview:destination.view];
[UIView animateWithDuration:.25
animations:^{
source.view.frame = sourceFrame;
destination.view.frame = destFrame;
}
completion:^(BOOL finished) {
[source presentViewController:destination animated:NO completion:nil];
}];
}
以上就是從右向左切換View動畫的實現,關鍵程式碼是:
sourceFrame.origin.x = -sourceFrame.size.width;
和
destFrame.origin.x = destination.view.frame.size.width;
將舊的View向左移動,新的View從最右開始進入。
最後,在動畫結束後,手動將當前View切換到新的View:
[source presentViewController:destination animated:NO completion:nil];
因為動畫效果我們已經自己實現了,所以切換到新的View就不要使用動畫了。
簡單修改上面的程式碼,就可以實現從左到右的Push切換動畫:
CGRect sourceFrame = source.view.frame;
sourceFrame.origin.x = sourceFrame.size.width;
CGRect destFrame = destination.view.frame;
destFrame.origin.x = -destination.view.frame.size.width;
destination.view.frame = destFrame;
利用Custom模式的Segue,可以實現任意切換動畫效果,對於簡單的非3D動畫,簡單的幾行程式碼即可實現。