在iPad上,我完美地使用了UISplitViewController。
我可以隐藏并显示其primaryViewController,并以适当的方式调用splitViewController:willChangeToDisplayMode:
。
但在iPhone上,出了点问题
我可以显示primaryViewController,但无法隐藏它,因为primaryViewController以全屏大小显示。它太满了,我无法触摸辅助视图,这样我就可以隐藏iPad上的primaryViewController。
splitViewController:willChangeToDisplayMode:
也未被调用。
我的自定义UISplitViewController类中有一个viewDidLoad。
// UISplitViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.delegate = self;
self.preferredPrimaryColumnWidthFraction = .1;
CGRect mainScreen = [[UIScreen mainScreen] bounds];
self.minimumPrimaryColumnWidth = 270;
self.maximumPrimaryColumnWidth = mainScreen.size.width - 5;
}
在iPhone上,任何这些属性似乎都不起作用:preferredPrimaryColumnWidthFraction or minimum/maximumPrimaryColumnWidth
我通过以下代码在AppDelegate.m中将此splitViewController添加为rootViewController。
// AppDelegate.m
[_splitViewCon addChildViewController: tagNaviCon];
[_splitViewCon addChildViewController: mainNaviCon];
self.window.rootViewController = _splitViewCon;
我在网上搜索了一些关键字,例如"容器视图"。
当我想在iPhone上使用UISplitViewController时,这是我要做的事情吗?
我也观看了WWDC视频,但我并不理解"如何准确编码" 。
目前,我不使用任何Interface Builder。如果有人用programmaticaly方式编写代码,我会很高兴。
谢谢!
答案 0 :(得分:3)
你也可以在iPhone 4S,5,5S和6上同时使用UISplitViewController。
要做到这一点,您必须将其视图嵌入另一个视图控制器(addChildViewController:
... didMoveToParentViewController:
)
之后,您可以通过覆盖其特征集合(setOverrideTraitCollection:forChildViewController:
)来控制分裂行为。基本上,您必须检查当前的特征集合并将水平尺寸类更改为常规。通过这种方式,UISplitController可以通过设置split preferredDisplayMode
然后在旋转时,您可以对特征集合进行相同的观察,并更改preferredDisplayMode,并在必要时再次覆盖分割的特征集合。这可以在viewWillTransitionToSize:withTransitionCoordinator:
或willTransitionToTraitCollection:withTransitionCoordinator:
中完成。第二个不会在iPad上被调用,因为它的尺寸等级在两个方向都是常规的。
关于我仍然无法解决的问题的一个注释。在iPhone 5S上,例如在纵向旋转时,我隐藏了主控制器,因此屏幕上只有一个视图,UISplitViewController应该适应UINavigationController。这工作正常,但在旋转动画期间,主视图正在消失,你可以看到一个空白的丑陋空间。
还有另一个注意事项 您必须实现UISplitViewControllerDelegate并使用方法来设置应用程序启动时应该可见的视图控制器以及拆分用作导航时。 Here是关于此问题的主题。
希望它有所帮助,如果我找到解决问题的方法,我会更新我的答案
答案 1 :(得分:0)
@ user1006806答案对我有用。这是我在UISplitViewController的旋转方法(iOS 8)中旋转期间摆脱丑陋空白的方法:
- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator {
UIInterfaceOrientation theOrientation = [[UIApplication sharedApplication] statusBarOrientation];
if (UIInterfaceOrientationIsPortrait(theOrientation)) {
self.preferredDisplayMode = UISplitViewControllerDisplayModeAllVisible;
} else {
self.preferredDisplayMode = UISplitViewControllerDisplayModeAutomatic;
}
[coordinator animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext> context) {
} completion:^(id<UIViewControllerTransitionCoordinatorContext> context) {
self.preferredDisplayMode = UISplitViewControllerDisplayModeAutomatic;
}];
[super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];
}