Ios iPad模态控制器在旋转后关闭
我正在使用序列图像板序列集Ios iPad模态控制器在旋转后关闭,ios,ipad,rotation,modalviewcontroller,Ios,Ipad,Rotation,Modalviewcontroller,我正在使用序列图像板序列集表单表呈现模式视图。 问题是,当我在显示该视图后旋转iPad时,该视图将从视图中删除/取消 我不知道为什么。这似乎只发生在从纵向开始,然后旋转到横向时 如果我从横向开始,然后显示视图,然后旋转,它会保持在屏幕上 有什么想法吗 编辑---- 旋转后,全屏模式视图似乎也会消失 演示代码中没有什么特别之处,这是一个全屏模式: EditViewController *editView = [self.navigationController.storyboard instant
表单表
呈现模式视图。
问题是,当我在显示该视图后旋转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
摆脱:editView.modalTransitionStyle=UIModalTransitionStyleFlipHorizontal;
// UIViewController+Popover.h
#import <UIKit/UIKit.h>
@interface UIViewController (Popover)
- (UIViewController *)popoverPresentingViewController;
@end
这将解决您遇到的问题。iPad上以表单形式显示的模态视图控制器无法使用这种转换样式正确旋转。很难找到发生这种情况的原因,因为我发现UIPover也会发生这种情况,就像旋转UIPover时一样,因为它隐藏了
因此,如果您想保持视图,只需在旋转后再次调用控制器即可获得良好的用户体验这不是一个bug,而是对
UISplitViewController
的限制。当masterViewController(它是一个UIPopoverController
)能够被解除时,问题就存在了。下面是它的工作原理,假设你的应用程序确实允许masterViewController在纵向中关闭,而不允许在横向中关闭
在纵向视图中,当masterViewController可见时,如果要在masterViewController中显示viewController中的模式,然后旋转到横向视图,则模式将在iOS7中消失,而应用程序在iOS8中不会旋转。iOS8引入了一个条件来防止iOS7的不良体验。iOS7在将masterViewController从popoverController移动到splitViewController中包含的viewController的过程中丢失模式
模式需要从splitViewController而不是masterViewController显示。唯一的问题是模式显示在masterViewController下方的纵向视图中。我的解决方案是关闭masterViewController,然后显示模式
根据代码的复杂程度,有几种方法可以实现此结果。下面是我在我的应用程序中如何做到这一点
我第一个子类UISplitViewController
,以获得对popoverController的引用。我使用委托转发来访问内部和外部的委托方法。这是h
// MainSplitViewController.h
#import <UIKit/UIKit.h>
@interface MainSplitViewController : UISplitViewController
@property (nonatomic, weak, readonly) UIPopoverController* primaryColumnController;
@end
还有.m
// 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+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:…
调用[self.popoverPresentingViewController presentViewController:…]
。请记住导入UIViewController+Popover.h很晚,但它对我的作用就在之前
[self presentViewController:aController animated:YES completion:nil];
关闭主控制器,添加以下行
[self.splitViewController setPreferredDisplayMode:UISplitViewControllerDisplayModePrimaryHidden];
[self.splitViewController setPreferredDisplayMode:UISplitViewControllerDisplayModeAutomatic];
然后展示您的控制器您的问题最接近我的错误,从modalView返回时,parentView将切换到打开应用程序的方向。
从视觉上看,模态视图似乎已旋转,然后返回 我通过完全删除模态视图并使用
[self.navigationController pushViewController: <the View(not modal now)>]
[self.navigationController pushview控制器:]
而不是使用-
[self presentViewController:<Modal View>]
[自我呈现视图控制器:]
我认为这是因为导航控制器不拥有模态视图,因此当从模态视图返回时,它会重新加载到错误的方向问题:
以模式显示视图控制器时,它会在旋转时被取消
方法:
- 设置
UISplitViewControllerDelegate
- 使用
方法UISplitViewControllerDelegate
- 在实例变量中保留对模态视图控制器的引用
- 检查模态视图控制器的显示视图控制器是否存在
- 如果它存在,则无需执行任何操作,否则只需在没有任何动画的情况下呈现
UISplitViewControllerDelegate
方法:
注:
有很多方法,一开始可能会让人望而生畏,如果你花些时间进行实验,你可以实现你想要的UISplitViewControllerDelegate
- 它具有细粒度的访问权限
[self.splitViewController presentViewController:editView animated:YES completion:nil];
你能展示展示模型的代码吗?哪个ios版本做了这个?没什么特别的,请看编辑我想你从来没有放置过导致这个问题的代码。请发布完整的代码,或者检查其他视图控制器是否会调用dismisspresentviewcontroller方法。嘿,你看过这篇文章吗?这家伙有类似的问题。谢谢,是的,这不是他也遇到了同样的问题。答案并不是真正的解决方案,我不想让Master一直在屏幕上。我担心这不起作用。问题仍然存在。随着行的插入,我确实看到了翻转水平过渡。对不起,我应该提到,上面粘贴的代码是全屏模式,而不是表单模式。问题em出现在bothPardon上,因为答案不正确。几年前曾经是这样,但我刚刚重新验证过,现在不再是这样。在当前的iOS中,无论使用哪种过渡样式,如果从主viewController显示,模式都会从纵向转换到横向。看起来好像SplitViewControllerer可能在某个地方内部调用dismissViewController。我认为我们应该提交错误报告。我实际上认为问题在于主视图和模态的所有权。因为主视图实际上是一个popover,在旋转时显示和删除。和UISplitViewC
[self.splitViewController presentViewController:editView animated:YES completion:nil];