![](/img/trans.png)
[英]Why is the CAGradientLayer removed from view after modal view controller is dismissed
[英]iPad modal controller is dismissed after rotation
我使用故事板segue設置為Form Sheet
呈現模態視圖。 問題是,當我在顯示此視圖后旋轉iPad時,視圖將從視圖中移除/被解除。
我不知道為什么。 它似乎只在以縱向開始然后旋轉到橫向時發生。
如果我從橫向開始然后顯示視圖然后旋轉它保持在屏幕上罰款。
有任何想法嗎?
編輯----
旋轉后,全屏模態視圖似乎也被忽略了!
演示代碼中沒有任何特殊內容,這是一個全屏模式:
EditViewController *editView = [self.navigationController.storyboard instantiateViewControllerWithIdentifier:@"editViewController"];
editView.delegate = self;
editView.image = image;
editView.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
[self presentViewController:editView animated:YES completion:nil];
這在iOS 6和iOS 7上都會發生
編輯2 ----忘了提,我是從UISplitViewController
的左/主視圖控制器呈現模態
很晚,但它對我有用的就是之前
[self presentViewController:aController animated:YES completion:nil];
關閉主控制器,添加此行
[self.splitViewController setPreferredDisplayMode:UISplitViewControllerDisplayModePrimaryHidden];
[self.splitViewController setPreferredDisplayMode:UISplitViewControllerDisplayModeAutomatic];
然后展示你的控制器
擺脫:editView.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal; 這將解決您遇到的問題。 在iPad上顯示為窗體表的模態視圖控制器無法使用該過渡樣式正確旋轉。
它真的很難得到原因如何以及為什么會發生這種情況,因為我發現這也發生在UIPopover也是當你旋轉它UIPopover隱藏因為???
因此,如果您想保持視圖,那么只需在輪換后再次調用您的控制器即可獲得良好的用戶體驗
這不是它對UISplitViewController
的限制的錯誤。 當masterViewController(它是一個UIPopoverController
)能夠被解除時,存在問題。 下面是假設您的應用程序允許masterViewController在縱向中被解除並且不允許在橫向中使用它是如何工作的。
在masterViewController可見的情況下,如果您要從masterViewController中的viewController呈現模態然后旋轉到橫向,則模式將在iOS7中消失,並且應用程序不會在iOS8中旋轉。 iOS8引入了防止iOS7糟糕體驗的條件。 iOS7在將masterViewController從popoverController移動到splitViewController中包含的viewController的過程中丟失了模態。
模態需要從splitViewController而不是masterViewController中呈現。 唯一的問題是模式在縱向下呈現在masterViewController下面。 我的解決方案是關閉masterViewController然后呈現模態。
根據代碼的復雜程度,有幾種方法可以實現此結果。 這是我在我的應用程序中執行此操作的方式。
我首先將UISplitViewController
子類UISplitViewController
,以便獲得對popoverController的引用。 我使用委托轉發來內部和外部訪問委托方法。 繼承人.h
// MainSplitViewController.h
#import <UIKit/UIKit.h>
@interface MainSplitViewController : UISplitViewController
@property (nonatomic, weak, readonly) UIPopoverController* primaryColumnController;
@end
還有他們
// MainSplitViewController.m
#import "MainSplitViewController.h"
@interface MainSplitViewController () <UISplitViewControllerDelegate>
@property (nonatomic, weak) id<UISplitViewControllerDelegate> externalDelegate;
@property (nonatomic, weak) UIPopoverController* primaryColumnController;
@end
@implementation MainSplitViewController
- (instancetype)init {
self = [super init];
if (self) {
self.delegate = self;
}
return self;
}
#pragma mark - Split View Controller Delegate
- (void)splitViewController:(UISplitViewController *)svc popoverController:(UIPopoverController *)pc willPresentViewController:(UIViewController *)aViewController {
self.primaryColumnController = pc;
if ([(id)self.externalDelegate respondsToSelector:_cmd]) {
[self.externalDelegate splitViewController:svc popoverController:pc willPresentViewController:aViewController];
}
}
#pragma mark - Delegate Forwarder
- (void)setDelegate:(id<UISplitViewControllerDelegate>)delegate {
[super setDelegate:nil];
self.externalDelegate = (delegate != self) ? delegate : nil;
[super setDelegate:delegate ? self : nil];
}
- (BOOL)respondsToSelector:(SEL)aSelector {
id delegate = self.externalDelegate;
return [super respondsToSelector:aSelector] || [delegate respondsToSelector:aSelector];
}
- (id)forwardingTargetForSelector:(SEL)aSelector {
id delegate = self.externalDelegate;
return [delegate respondsToSelector:aSelector] ? delegate : [super forwardingTargetForSelector:aSelector];
}
@end
接下來,我在UIViewController
上創建一個類擴展
// UIViewController+Popover.h
#import <UIKit/UIKit.h>
@interface UIViewController (Popover)
- (UIViewController *)popoverPresentingViewController;
@end
還有他們
// UIViewController+Popover.m
#import "UIViewController+Popover.h"
#import "MainSplitViewController.h"
@implementation UIViewController (Popover)
- (UIViewController *)popoverPresentingViewController {
UIViewController* viewController = self;
if ([self.splitViewController isKindOfClass:[MainSplitViewController class]]) {
viewController = self.splitViewController;
MainSplitViewController* mainSplitViewController = (MainSplitViewController *)self.splitViewController;
if (mainSplitViewController.primaryColumnController.popoverVisible) {
[mainSplitViewController.primaryColumnController dismissPopoverAnimated:YES];
}
}
return viewController;
}
@end
現在你在哪里呈現模態,而不是調用[self presentViewController: ...
call [self.popoverPresentingViewController presentViewController: ...]
。 記得導入UIViewController + Popover.h
你的問題最接近我的bug,從modalView返回時,parentView將切換到打開應用程序的方向。
在視覺上看起來模態視圖被旋轉然后返回。
我通過完全刪除模態視圖並使用來解決它
[self.navigationController pushViewController: <the View(not modal now)>]
而不是使用 -
[self presentViewController:<Modal View>]
我認為這是因為導航控制器不擁有模態視圖,因此當從模態視圖返回時它會重新加載到不正確的方向
以模態方式呈現視圖控制器時,它會在旋轉時被解除。
UISplitViewControllerDelegate
UISplitViewControllerDelegate
方法 UISplitViewControllerDelegate
方法: func primaryViewController(forCollapsing splitViewController: UISplitViewController) -> UIViewController? {
if let someModalViewController = someModalViewController,
someModalViewController.presentingViewController == nil {
let masterViewController = viewControllers.first
masterViewController?.present(someModalViewController,
animated: false) {
}
}
return nil
}
func primaryViewController(forExpanding splitViewController: UISplitViewController) -> UIViewController? {
if let someModalViewController = someModalViewController,
someModalViewController.presentingViewController == nil {
let masterViewController = viewControllers.first
masterViewController?.present(someModalViewController,
animated: false) {
}
}
return nil
}
UISplitViewControllerDelegate
有很多方法,最初可能令人生畏,如果你花一些時間進行實驗,你可以實現你想要的。 我很遲,但試試這個。 這個對我有用。
[self.splitViewController presentViewController:editView animated:YES completion:nil];
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.