UISplitViewController:力如何显示在应用程序启动主酥料饼? (肖像)(UIS

2019-07-29 06:13发布

在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)