【问题标题】:UIDatePicker with .compact style doesn't respect content hugging priority.compact 样式的 UIDatePicker 不尊重内容拥抱优先级
【发布时间】:2021-01-08 10:47:21
【问题描述】:

我认为带有.compact 样式的新UIDatePicker (iOS 14+) 不能与AutoLayout 一起正常工作。

使用UILabelUIDatePicker 制作一个简单的布局,其中UIDatePicker 具有更高的内容拥抱优先级,如果有太多可用空间,则应该会导致UILabel 被拉伸的布局,但事实并非如此会发生什么。

这就是我得到的结果:

这里是示例代码:

class ViewController: UIViewController, UIGestureRecognizerDelegate {
    private let label: UILabel = {
        let label = UILabel()
        label.translatesAutoresizingMaskIntoConstraints = false
        label.text = "Label"
        label.backgroundColor = .yellow
        return label
    }()
    
    private let datePicker: UIDatePicker = {
        let datePicker = UIDatePicker()
        datePicker.translatesAutoresizingMaskIntoConstraints = false
        datePicker.preferredDatePickerStyle = .compact
        return datePicker
    }()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        view.addSubview(label)
        view.addSubview(datePicker)
        
        label.setContentHuggingPriority(.defaultLow, for: .horizontal)
        datePicker.setContentHuggingPriority(.defaultLow + 1, for: .horizontal)
        
        NSLayoutConstraint.activate([
            label.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 8),
            label.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor, constant: 8),
            
            label.bottomAnchor.constraint(equalTo: datePicker.bottomAnchor),
            label.trailingAnchor.constraint(equalTo: datePicker.leadingAnchor, constant: -8),
            
            datePicker.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 8),
            datePicker.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor, constant: -8)
        ])
    }
}

我错过了什么吗?这是一个已知问题吗?

【问题讨论】:

  • 您假设日期选择器具有基于其文本的固有内容大小宽度,例如标签。但我们为什么要期待呢?
  • @matt,我希望这是因为 Apple 的文档中的这一点 You should integrate date pickers in your layout using Auto Layout. Although date pickers can be resized, they should be used at their intrinsic content size. developer.apple.com/documentation/uikit/uidatepicker
  • 好的,谢谢。我进行了实验,对我来说这按预期工作。

标签: ios autolayout uikit uidatepicker


【解决方案1】:

对我来说很好用。将标签的横向内容拥抱优先级设置为.defaultLow-1

【讨论】:

  • 这可行,但我仍然认为这是一个奇怪的行为/错误。将.defaultLow + 1 设置为UIDatePicker 在此示例中应该具有相同的效果。
  • 是的,很公平。我再看一下。
  • 好的,我支持你。看起来有什么东西出现了,并将日期选择器的内容优先级设置回.defaultLow,这就是为什么你必须弄乱标签的原因。所以我所做的是一种解决方法,但仅此而已。您可能需要就此提交错误报告。
  • 该值实际上并没有改变,但它作用就像该值仍然是 250。
猜你喜欢
  • 2018-12-01
  • 2023-02-18
  • 1970-01-01
  • 1970-01-01
  • 2019-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-19
相关资源
最近更新 更多