ipad - 如何将 UISplitViewController 用作模态视图 Controller ?

标签 ipad ios uisplitviewcontroller modalviewcontroller

我正在尝试在我的 iPad 应用程序中显示一个 UISplitViewController,将其呈现为模态视图 Controller 。我设法让它显示出来,但由于某种原因,模态视图左侧有一个状态栏大小的间隙,当方向改变时,状态栏也会保留。

alt text

有人知道为什么会这样吗?或者这是否可能?也许我只是在给自己挖一个大坑。

最佳答案

像你们中的许多人一样,我需要一种“模态方式”来使用 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();
 }

其中“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;

旁注:我想大部分的混淆源于这样一个事实 Apple 文档中的 UISplitView 使用示例使用窗口 在 appDelegate 中创建,事实上大多数人都不是 如此熟悉窗口概念——因为我们通常不需要 到(它们在 Storyboard或样板代码中创建一次)。

另外,如果你正在做状态恢复,不应该 忘记以编程方式创建的 UIViewControllers 不会 由系统自动恢复。

关于ipad - 如何将 UISplitViewController 用作模态视图 Controller ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4739801/

相关文章:

objective-c - 快速确定文件是否为有效视频

ios - 为什么 App Store Connect 中有两个 12.9 英寸大小的屏幕截图选项?

cocoa-touch - UISplitViewController 中的 UIPopOverController

ios - 如何在自定义 CNContactViewController 中异步更新图像

ios - 如何在 iPhone 6 plus 上实现新的类似 iPad 的横向模式

ios - 为什么 viewDidLoad 中 self.splitViewController 突然变成 nil 了?

CSS 媒体查询和纵向模式

objective-c - UINavigationController 上的自定义宽度

objective-c - 如何在不保存的情况下使用核心数据模型?

ios - 如何在 Objective C 中单击按钮时更新 UILabel 的 centerXAnchor