如何使用UISplitViewController作为模态视图控制器?

A S*_*edo 7 ipad uisplitviewcontroller modalviewcontroller ios

我试图在我的iPad应用程序中显示一个UISplitViewController,将其显示为模态视图控制器.我设法显示它,但由于某种原因,模态视图左侧有一个间隙,状态栏的大小也会在方向更改时保留.

替代文字

有人知道为什么会这样吗?或者如果这是可能的话?也许我只是在挖自己一个巨大的洞.

Thi*_*car 8

就像你们许多人一样,我需要一种"模态方式"来使用UISplitViewController.这似乎是一个老问题,但我在StackOverflow中发现的最多只是解释为什么当你试图这样做时(例如上面接受的答案)或'hack-arounds'时问题发生.

但是,有时更改大部分代码库并使UISplitViewController成为初始对象以使其功能正常运行也不是很方便.

事实证明,有一种方法可以让每个人都满意(包括Apple指南).我发现最好的解决方案是正常使用UISplitViewController,但是当需要显示/解除时,请使用以下方法:

-(void)presentWithMasterViewController: (UIViewController *) thisMasterViewController
   andDetailViewController: (UIViewController *) thisDetailViewController
                        completion:(void(^)(void))completion
{
    masterViewController = thisMasterViewController;
    detailViewController = thisDetailViewController;

    [self setViewControllers:[NSArray arrayWithObjects:masterViewController, detailViewController, nil]];

    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    self.window.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight;

    self.window.rootViewController = self;

    [self.window makeKeyAndVisible];

    if(completion)
        completion();
    }

-(void)dismissViewControllerWithCompletion:(void (^)(void))completion
 {
     self.window = nil;
     masterViewController = nil;
     detailViewController = nil;
     if(completion)
         completion();
 }
Run Code Online (Sandbox Code Playgroud)

其中"window",是UISplitViewController子类的属性.系统将负责其余部分!

为了方便/参考,我将它作为UISplitViewController子类上传到gitHub:

ModalSplitViewController

- 如何使用示例 -

    mySplitViewController = [[ModalSplitViewController alloc] init];
    mySplitViewController.delegate = self;

    [mySplitViewController presentWithMasterViewController:masterViewController andDetailViewController:detailViewController completion:nil];

    // when done:

    [mySplitViewController dismissViewControllerWithCompletion:nil];
    mySplitViewController = nil;
Run Code Online (Sandbox Code Playgroud)

旁注:我猜大多数混淆源于Apple文档中的UISplitView用法示例使用appDelegate中创建的窗口,以及大多数人对窗口概念不太熟悉的事实 - 因为我们通常不会不需要(它们在StoryBoards或样板代码中创建一次).

此外,如果您正在进行状态恢复,则不应忘记系统不会自动恢复以编程方式创建的UIViewControllers.


Eva*_*ski 6

该库存UISplitViewController仅用作根视图控制器.以模态方式呈现一个与Apple人机界面指南相反,并且很有可能被App Review团队拒绝.此外,您可能会收到错误:

应用程序尝试以模态方式呈现拆分视图控制器

  • 另一种方法是在尺寸上尝试售后分离视图控制器,例如https://github.com/SlavaBushtruk/APSplitViewController (3认同)
  • 赞成"售后视图控制器" (2认同)