编程滑块约束未更新

Programmed Slider Constraint is Not Updating

我正在尝试学习如何以编程方式使用滑块和按钮在故事板中填充视图。目前,我正在尝试让一个已编程的滑块遵守已编程的 NSLayoutConstraint

这是我的代码:

let centerXConstraint =  NSLayoutConstraint(item: self.volumeSliderP, attribute: NSLayoutAttribute.centerX, relatedBy: NSLayoutRelation.equal, toItem: self.view, attribute: NSLayoutAttribute.centerX, multiplier: 1.0, constant: 10.0)

self.view.addConstraint(centerXConstraint)

我应该提一下,当我用第一个 item 替换视图中已经存在的滑块时(它是通过故事板放置的,它自己的约束也放置在 IB/Storyboard 中),它确实使用上面的 NSLayoutConstraint 代码正确更新。此外,我已经能够使用自定义代码更新我的编程 volumeSliderP 以更改它的手柄并将其成功旋转到垂直。

我错过了什么步骤才能让这个 NSLayoutConstraint 代码在我编程的滑块上工作?

感谢您的帮助!

在代码中使用约束时,无论控件类型如何,您都需要做两件(也许三件)事情:

  • translatesAutoresizingMaskIntoConstraints 设置为 false。

不这样做会引发约束冲突,这将出现在控制台日志中。我通常为此创建 UIView 的扩展:

public func turnOffAutoResizing() {
    self.translatesAutoresizingMaskIntoConstraints = false
    for view in self.subviews as [UIView] {
        view.translatesAutoresizingMaskIntoConstraints = false
    }
}

然后在viewDidLoad(添加我的子视图之后)我简单地添加一行:

view.turnOffAutoResizing()

如链接的 Apple 文档中所述,如果您有标签和文本字段,文本字段将扩展以适合标签,而无需设置宽度。 UISlider 没有固有宽度,但它有固有高度。

  • 所以在你的情况下,你不仅需要设置位置,还需要定义宽度。

topleading 的组合足以让布局引擎知道 "where" 和 "height",但不会知道 "width"。如果您为 Y 因子(顶部、底部、中心 Y)定义了 "centerX" 和某些东西(您没有列出任何代码),情况也是如此。

如果我说得很清楚,你应该能够看到引擎会知道足够多的东西(在帧坐标中)"start the slider at X/Y, height is XX points (it has intrinsic height), but how long should it be?"

我通常设置顶部、前导和尾随...或顶部、centerX 和宽度。但它因需要而异。