在iPad应用程序我使用的UISplitViewController。 我需要强制显示主酥料饼时,应用程序启动在纵向模式。
现在,我使用这个代码和它的工作原理以及在iOS 5.0。
if (UIInterfaceOrientationIsPortrait(self.interfaceOrientation)) {
if ([[[AppDelegate sharedAppDelegate] splitViewController] respondsToSelector:[[[AppDelegate sharedAppDelegate] btnMenu] action]]) {
[[[AppDelegate sharedAppDelegate] splitViewController] performSelector:[[[AppDelegate sharedAppDelegate] btnMenu] action]];
}
}
但在iOS的5.1(与新型主酥料饼的)的行为似乎是随机的。 有时酥料饼显示全屏,有时效果很好。
有的建议为5.1?
Answer 1:
我这个一期一会挣扎着,甚至到现在我不是100%满意的解决方案,但它是我已经能够拿出的唯一的事情,鉴于目前的限制。
首先,覆盖下面的委托方法:
- (void)splitViewController:(UISplitViewController *)splitController willHideViewController:(UIViewController *)viewController withBarButtonItem:(UIBarButtonItem *)barButtonItem forPopoverController:(UIPopoverController *)popoverController
并且用它来抓取到栏按钮项的引用,并将其存储在一个实例变量:
barButtonForMaster = barButtonItem;
然后,当你想显示主视图控制器,做这样的呼吁:
[barButtonForMaster.target performSelector: barButtonForMaster.action withObject: barButtonForMaster];
如果你想在开始执行这一权利,那么为了防止应用程序崩溃(感谢帮助的注释)使用一些延迟:
[barButtonForMaster.target performSelector: barButtonForMaster.action withObject: barButtonForMaster afterDelay:1];
在这种情况下,你可以执行拆分视图的委托方法的选择权。
Answer 2:
这里没有5.1的建议,但一个8.0:
现在iOS8上,有一堆的新方法UISplitViewController
配置。
在你的情况,中庸之道设置正确的价值preferredDisplayMode
,例如在masterViewController viewDidLoad
。
Objective-C的:
- (void)viewDidLoad {
// configuring splitviewcontroller
self.splitViewController.preferredDisplayMode = UISplitViewControllerDisplayModeAllVisible;
//....
}
迅速:
override func viewDidLoad() {
self.splitViewController?.preferredDisplayMode = UISplitViewControllerDisplayMode.AllVisible
}
但它仅是当然的iOS8上。
Answer 3:
在罗布的回答扩展,这很适合我(在细节画面的viewDidLoad中):
//If in portrait mode, display the master view
if (UIInterfaceOrientationIsPortrait(self.interfaceOrientation)) {
[self.navigationItem.leftBarButtonItem.target performSelector:self.navigationItem.leftBarButtonItem.action withObject:self.navigationItem];
}
无需获取一个单独的参考,使用self.navigationItem.leftBarButtonItem代替
Answer 4:
对于iOS8上最简单的方法是以下几点:
self.splitViewController.preferredDisplayMode = UISplitViewControllerDisplayModePrimaryOverlay;
我用这个当应用程序被启动的第一时间显示masterViewController日志项。 在我使用的所有其他情况
self.splitViewController.preferredDisplayMode = UISplitViewControllerDisplayModeAutomatic
Answer 5:
如果你需要在应用程序启动,覆盖您的详细视图控制器此方法:
-(BOOL)splitViewController:(UISplitViewController *)svc shouldHideViewController:(UIViewController *)vc inOrientation:(UIInterfaceOrientation)orientation
{
return NO;
}
但是,如果你再需要它随后隐藏它看起来好像方法不叫,所以你必须手动将其隐藏。
Answer 6:
稍微少哈克变化(SWIFT):
let btn = self.splitViewController!.displayModeButtonItem()
btn.target?.performSelector(btn.action, withObject: btn)
Answer 7:
我用这个解决方案:
在splitViewController在viewDidLoad中设置DISPLAYMODE到.primaryOverlay
override func viewDidLoad() {
if self.isCollapsed == false, self.displayMode == .primaryHidden {
self.preferredDisplayMode = .primaryOverlay
}
}
而在viewWillAppear中设置回。自动
override func viewWillAppear(_ animated: Bool) {
self.preferredDisplayMode = .automatic
}
这样,主视图将在发射UISplitViewController的显示,并具有缺省行为后方向会改变。
Answer 8:
没有必要继续绕到barButtonItem傻引用。 只需拨打同一个目标/行动。 见我的回答https://stackoverflow.com/a/25695923/1021430
目标是拆分视图控制器和动作是toggleMasterVisible:
文章来源: UISplitViewController: How force to show master popover in app launch? (portrait)