iPhone Plus横屏时UISplitViewController为何显示双控制器?
为啥iPhone 6横屏只显示一个控制器,iPhone 6 Plus横屏却显示俩?
这事儿其实是UISplitViewController跟着苹果的「尺寸类(Size Classes)」规则走导致的,咱们掰开揉碎了说:
1. 先搞懂两款设备横屏的尺寸类差异
苹果给不同设备的屏幕划分了不同的尺寸类,这才是核心逻辑:
- iPhone 6横屏时,屏幕宽度是667pt,对应的水平尺寸类是紧凑(Compact)
- iPhone 6 Plus横屏时,屏幕宽度是736pt,对应的水平尺寸类是常规(Regular)
UISplitViewController有个默认行为:在水平常规尺寸类下,就会默认显示双列(主控制器+详情控制器);但在水平紧凑尺寸类下,就只会显示单列(要么主要么详情,得通过导航栏切换)。
2. 结合你设置的参数再细算
你给SplitVC设了这三个参数:
splitViewController.preferredPrimaryColumnWidthFraction = 0.4splitViewController.minimumPrimaryColumnWidth = 320splitViewController.maximumPrimaryColumnWidth = 1000
咱们算两款设备的主列宽度情况:
- iPhone 6横屏总宽度667pt,按0.4比例算主列是
667*0.4=266.8pt,但你设了最小主列宽度是320pt——不过关键不是宽度够不够,是尺寸类的规则优先级更高,只要是水平紧凑类,SplitVC就默认单列布局。 - iPhone 6 Plus横屏总宽度736pt,按0.4比例算主列是
736*0.4=294.4pt,比你设的最小320pt小,所以主列会取320pt,剩下的736-320=416pt给详情列。这时候因为是水平常规尺寸类,就会直接显示双列。
3. 要是想让iPhone 6横屏也显示双列咋办?
如果你非要在iPhone 6横屏也显示双列,可以强制SplitVC的显示模式,比如:
// iOS 13及以前用这个 splitViewController.preferredDisplayMode = .twoOverSecondary // iOS 14+可以用更灵活的设置 splitViewController.preferredSplitBehavior = .tile
不过提醒下,iPhone 6横屏本身就窄,强制双列可能会让两个控制器的布局都挤得慌,得做好界面适配哦。
内容的提问来源于stack exchange,提问作者Daniele B
相关产品推荐
相关产品推荐

