【发布时间】:2016-06-15 23:37:36
【问题描述】:
我进行了搜索,甚至想出了潜在的解决方案。可悲的是,他们都没有说话。我试图通过增加它的leadingAnchor-Constraint 来为视图的x-Position 设置动画。
我这样创建我的约束:
let margins = self.layoutMarginsGuide
horizontalConstraint = underline.leadingAnchor.constraintEqualToAnchor(margins.leadingAnchor)
并像这样编辑约束常量:
func updateUnderlinePosition(offset:CGFloat, pageCount:Int) {
//Underline just over width of one Screen:
var underlineOffset = offset / CGFloat(pageCount)
//Add left margin:
let margins = self.layoutMarginsGuide
underlineOffset += 15
//reposition underlineview
horizontalConstraint.constant += underlineOffset
self.layoutIfNeeded()
}
为什么我会收到错误消息,告诉我存在冲突的约束?
"<NSLayoutConstraint:0x7fca2b8c72c0 UIView:0x7fca29d1c830.leading == UILayoutGuide:0x7fca2b8c4970'UIViewLayoutMarginsGuide'.leading>",
"<NSLayoutConstraint:0x7fca29c2ccd0 UIView:0x7fca29d1c830.leading == UILayoutGuide:0x7fca2b8c4970'UIViewLayoutMarginsGuide'.leading + 16.25>"
编辑:
约束是这样创建的:
override func layoutSubviews() {
super.layoutSubviews()
//underline.frame = CGRectMake(15, self.frame.height-10, 40, 2)
underline.translatesAutoresizingMaskIntoConstraints = false
underline.backgroundColor = UIColor.whiteColor()
underline.layer.cornerRadius = 1.0
self.addSubview(underline)
print(self.backItem)
let margins = self.layoutMarginsGuide
horizontalConstraint = underline.leadingAnchor.constraintEqualToAnchor(margins.leadingAnchor)
let verticalConstraint = underline.centerYAnchor.constraintEqualToAnchor(margins.bottomAnchor)
let widthConstraint = underline.widthAnchor.constraintEqualToAnchor(nil, constant: 40)
let heightConstraint = underline.heightAnchor.constraintEqualToAnchor(nil, constant: 2)
NSLayoutConstraint.activateConstraints([horizontalConstraint, verticalConstraint, widthConstraint, heightConstraint])
}
【问题讨论】:
-
看起来你正确地修改了约束,但是有第二个约束与之冲突。在调用
updateUnderlinePosition之前,您应该检查为此视图定义了哪些约束,我怀疑您会看到多个主要约束。就您如何最终获得两个主要约束而言,如果不了解它们是如何创建/激活的,就很难说。在创建horizontalConstraint并激活它之前,您可能已经有了前导约束。 -
添加了创建约束的方法。 HorizontalConstraint 是一个全局变量,以后可以访问它。
标签: ios xcode swift constraints