iOS 9 iPhone端UISplitViewController preferredPrimaryColumnWidthFraction不生效问题
我之前也碰到过这个坑,给你捋捋几个最容易遗漏的关键点,按这个顺序排查应该能解决:
先确认SplitViewController的显示模式
默认情况下,iPad上的SplitViewController可能是.overlay模式(主列滑出显示),这种模式下preferredPrimaryColumnWidthFraction这类属性是不生效的。你需要把显示模式改成.doubleColumn或者.tripleColumn,让它固定分栏显示:splitViewController?.preferredDisplayMode = .doubleColumn也可以直接在Storyboard的Attributes Inspector里找到“Preferred Display Mode”选项,改成“Double Column”。
确保设置时机正确
如果在viewDidLoad里设置宽度属性,大概率会因为布局还没初始化而失效。建议把设置代码放到viewWillLayoutSubviews()或者viewDidAppear(_:)里,确保布局完成后再生效:override func viewWillLayoutSubviews() { super.viewWillLayoutSubviews() guard let splitVC = splitViewController else { return } splitVC.preferredPrimaryColumnWidthFraction = 0.5 splitVC.maximumPrimaryColumnWidth = view.bounds.width * 0.5 splitVC.minimumPrimaryColumnWidth = view.bounds.width * 0.5 }检查Storyboard里的冲突设置
打开Storyboard的SplitViewController属性面板,看看有没有勾选“Prefer Hidden”(强制隐藏主列),或者主控制器有没有被手动添加过宽度约束——这些都会覆盖SplitViewController的自动布局设置。区分设备和屏幕方向
如果是在iPhone上测试,要注意:只有在横屏模式(或者大屏iPhone的横屏)下,SplitViewController才会进入分栏模式,宽度设置才会生效。竖屏状态下它会自动折叠成导航栈,主列必然是全屏的,这是系统默认行为。排查SplitViewController的Delegate方法
如果你实现了UISplitViewControllerDelegate,检查有没有实现splitViewController(_:shouldHidePrimaryColumnForTraitCollection:)这个方法。如果它返回true,会强制隐藏主列,导致你的宽度设置完全没用。确保这个方法返回合适的值,或者直接去掉这个实现(如果不需要的话)。
内容的提问来源于stack exchange,提问作者Bob Bobster

