iOS 16下UIPickerView高度异常求助(iOS 15正常)
iOS 16中UIPickerView高度异常的适配解决方案
问题核心原因
在iOS 16中,苹果对UIPickerView的布局规则做了变更:新增了默认最小高度限制(162pt)。当你尝试设置低于该值的高度时,系统会自动将Picker的高度强制调整到最小允许值,同时抛出-[UIPickerView setFrame:]: invalid size {x, y} pinned to {x, 162}的警告,这就是你看到初始化后高度从80变为162的原因。
可行的适配方案
方案1:适配系统默认最小高度(推荐)
如果布局允许,直接使用iOS 16默认的162pt高度,这是最符合系统人机交互规范的方案,不会有兼容性问题,也能保证Picker的交互体验。
方案2:自定义行高缩小整体高度
如果只需要显示少量选项,可以通过自定义行高来降低Picker的整体高度(系统仍会有最低高度限制,但会比162小):
实现UIPickerViewDelegate的pickerView(_:rowHeightForComponent:)方法:
func pickerView(_ pickerView: UIPickerView, rowHeightForComponent component: Int) -> CGFloat { return 24 // 根据需求调整行高,比如24pt }
Picker的整体高度会根据显示行数+系统默认上下边距计算,比如3行的话,最终高度大概在96pt左右,能大幅缩小尺寸。
方案3:强制裁剪固定高度(应急方案)
如果必须要固定80pt的高度,可以通过裁剪的方式实现,但可能影响交互体验:
- 首先修正约束代码的错误:手动添加AutoLayout约束时,必须将
translatesAutoresizingMaskIntoConstraints设为false(之前设为true会导致系统自动约束和手动约束冲突) - 开启裁剪并添加约束:
rolloffPicker.translatesAutoresizingMaskIntoConstraints = false rolloffPicker.clipsToBounds = true // 开启裁剪 NSLayoutConstraint.activate([ rolloffPicker.widthAnchor.constraint(equalTo: pickerFrame.widthAnchor), rolloffPicker.heightAnchor.constraint(equalToConstant: 80), // 按需添加位置约束,比如对齐父视图 rolloffPicker.topAnchor.constraint(equalTo: pickerFrame.topAnchor), rolloffPicker.leadingAnchor.constraint(equalTo: pickerFrame.leadingAnchor) ])
这种方式会将Picker超出80pt的部分裁剪掉,滚动时可能会有视觉断层,仅建议在特殊场景下使用。
内容的提问来源于stack exchange,提问作者Jonathan Just
相关产品推荐
相关产品推荐

