想用 presentModalViewController 彈出子視圖,並指定翻轉/溶解等轉場動畫,但在 CATransition 找不到對應常數。
被呈現的視圖控制器擁有 modalTransitionStyle 屬性,四種內建風格:
| 常數 | 效果 | 適用場景 |
|---|---|---|
UIModalTransitionStyleCoverVertical | 從底部滑入(預設) | 通用模態頁面 |
UIModalTransitionStyleFlipHorizontal | 水平翻轉 | 設定頁、卡片翻面 |
UIModalTransitionStyleCrossDissolve | 交叉淡入淡出 | 輕量提示、圖片預覽 |
UIModalTransitionStylePartialCurl | 頁面翻角 | 地圖/書本翻頁隱喻 |
// 呈現端
SecondViewController *vc = [self.storyboard instantiateViewControllerWithIdentifier:@"Second"];
vc.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal; // 設定動畫風格
vc.modalPresentationStyle = UIModalPresentationFullScreen; // iOS 13+ 預設為頁面捲動,需指定全螢幕
[self presentViewController:vc animated:YES completion:nil];
內建風格不足時,實作 UIViewControllerTransitioningDelegate 回傳自定義 UIViewControllerAnimatedTransitioning:
// 呈現端
vc.transitioningDelegate = self; // 實作 UIViewControllerTransitioningDelegate
vc.modalPresentationStyle = UIModalPresentationCustom;
// Delegate 方法
- (id)animationControllerForPresentedController:(UIViewController *)presented
presentingController:(UIViewController *)presenting
sourceController:(UIViewController *)source {
return [[CustomTransitionAnimator alloc] init];
}
modalTransitionStyle:必須設定在被呈現的 VC 上。UIModalPresentationPageSheet:若需全螢幕覆蓋,必須額外設定 modalPresentationStyle = UIModalPresentationFullScreen。CATransition 與 modalTransitionStyle:前者用於 Layer 動畫,後者是 VC 轉場高層 API。善用 modalTransitionStyle 四種內建風格可滿足 90% 場景,複雜需求再投入自定義轉場架構。