我正在尝试学习如何使用滑块和按钮以编程方式填充故事板中的视图。我目前正在努力让一个编程滑块符合编程的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
替换为视图中已经存在的滑块(通过Storyboard放置,并且它自己的约束也放置在IB / Storyboard中)时,它确实正确更新使用上面的NSLayoutConstraint
代码。此外,我已经能够使用自定义代码更新我编程的volumeSliderP
以更改其句柄并将其成功旋转到垂直位置。
我错过了哪一步允许此NSLayoutConstraint
代码在我的编程滑块上工作?
感谢您的帮助!
答案 0 :(得分:1)
在代码中使用约束时,无论控件类型如何,都需要做两件事(可能是三件事):
translatesAutoresizingMaskIntoConstraints
设置为false。如果不这样做,将引发约束冲突,这些冲突将出现在控制台日志中。我通常为此创建UIView的扩展名:
public func turnOffAutoResizing() {
self.translatesAutoresizingMaskIntoConstraints = false
for view in self.subviews as [UIView] {
view.translatesAutoresizingMaskIntoConstraints = false
}
}
然后在viewDidLoad
(添加我的子视图后),我只需添加一行:
view.turnOffAutoResizing()
如链接的Apple文档中所述,如果您有标签和文本字段,则文本字段将展开以适合标签,而无需设置宽度。 UISlider没有固有宽度,但确实具有固有高度。
top
和leading
的组合将足以让布局引擎知道“where”和“height”,但不知道“width”。如果你为Y因子(top,bottom,centerY)定义了“centerX”和你没有列出任何代码的东西,那就相同了。
如果我清楚地说明这一点,你应该能够看到引擎知道足够的说法(在框架坐标中)“在X / Y处开始滑块,高度是XX点(它具有固有高度),但它应该多长时间?“
我通常设置top,leading和trailing ......或top,centerX和width。但它随着需要而变化。