UIKit问题:UICollectionViewCell中内嵌的UIPickerView不可见如何解决?
问题原因
DigitControlItem内部给UIPickerView添加约束时,绑定的是当前视图的safeAreaLayoutGuide锚点,当该视图嵌套进UICollectionViewCell时,safeArea 会产生额外适配偏移,导致UIPickerView被挤压到可视范围外。- 当前设置的单个数字控件高度仅为32,远小于
UIPickerView的默认最小适配高度(系统原生UIPickerView正常展示的最小高度约为120~160),内容被压缩裁剪导致不可见。 - 可选问题:
UICollectionViewFlowLayout横向滚动时,仅配置了minimumLineSpacing,缺少minimumInteritemSpacing配置,可能出现横向间距不符合预期的问题。
修复方案
- 替换
DigitControlItem中UIPickerView的约束锚点,把safeAreaLayoutGuide改为当前视图本身的锚点,修改setupSettingPickerView方法的约束代码:
private func setupSettingPickerView() { addSubview(categoryPickerView) let constraints = [ categoryPickerView.topAnchor.constraint(equalTo: topAnchor, constant: 0), categoryPickerView.bottomAnchor.constraint(equalTo: bottomAnchor, constant: 0), categoryPickerView.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 0), categoryPickerView.trailingAnchor.constraint(equalTo: trailingAnchor, constant: 0) ] NSLayoutConstraint.activate(constraints) }
- 调整控件高度到合理范围,修改
NumberViewItemArea初始化的高度参数,例如改为160:
let itemArea = NumberViewItemArea(itemWidth: 60, itemHeight: 160, numOfDigits: 1, spaceBetweenDigits: 8)
如果确实需要小尺寸的数字选择器,也可以通过 UIPickerViewDelegate 自定义行高实现,在 DigitControlItem 的代理实现中添加以下代码:
public func pickerView(_ pickerView: UIPickerView, rowHeightForComponent component: Int) -> CGFloat { return 30 }
- 可选优化:在
NumberView的UICollectionViewDelegateFlowLayout实现中补充同行动间距配置:
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat { return spaceBetweenItems }
完成以上修改后重新运行即可看到 UIPickerView 正常展示在 UICollectionViewCell 中。
内容的提问来源于stack exchange,提问作者Dmitry
相关产品推荐
相关产品推荐

