不要在水平紧凑的环境中崩溃UISplitViewController

时间:2015-09-18 16:30:17

标签: ios iphone ipad cocoa-touch uisplitviewcontroller

splitView的默认行为是当它从水平常规环境转换为水平紧凑环境时崩溃。 有可能以某种方式覆盖它吗?

由于某些设计解决方案,我希望UISplitViewController始终得到扩展。 我在collapsed的文档中找不到解决方案:属性<nav role="navigation"> <div align="center"> <ul> <li><a href="index.php">Home</a></li> <li><a href="games.php">Games</a></li> <li><a href="trivia.php">Trivia</a></li> <li><a href="contact.php">Contact</a></li> </ul> </div> </nav> 是只读的,委托方法仅适用于&#34;如何折叠&#34;,但不是为了&#34;根本不崩溃&#34;。我使用的是iOS9 SDK。

1 个答案:

答案 0 :(得分:1)

我明白了。 文件声明:

  

拆分视图控制器确定其子视图的排列   控制器基于可用空间。在横向规则   环境,拆分视图控制器呈现其视图控制器   尽可能并排。在水平紧凑的环境中,   拆分视图控制器更像是导航控制器,   最初显示主视图控制器并按或   根据需要弹出辅助视图控制器。

因此,splitView将始终在Compact水平环境中折叠并在Regular中展开。解决方案是告诉splitView我们希望它扩展时它具有Regular水平环境。这个想法取自WWDC 2014 Video&#34;使用UIKit构建自适应应用程序&#34;。不幸的是,他们在视频中提及的sample code并未涵盖此案例。但是我的想法是为SplitViewController创建包含ViewController,我们可以使用方法setOverrideTraitCollection:forChildViewController:覆盖SplitViewController的trait集合

@implementation ContainingViewController

- (instancetype)initWithNibName:(nullable NSString *)nibNameOrNil bundle:(nullable NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nil bundle:nil];
    if (self)
    {
        _splitViewController = [[UISplitViewController alloc] initWithNibName:nil bundle:nil];
        _splitViewController.viewControllers = <view controllers>;

        [self addChildViewController:_splitViewController];
        [self.view addSubview:_splitViewController.view];

        UITraitCollection *horizontallyRegularTraitCollection = [UITraitCollection traitCollectionWithHorizontalSizeClass:UIUserInterfaceSizeClassRegular];
        [self setOverrideTraitCollection:horizontallyRegularTraitCollection forChildViewController:_splitViewController];
    }
    return self;
}

使用此代码,SplitViewController将始终具有常规水平特征集合,从而进行扩展。