我有看起来像这样的ViewController。有父ScrollView持有UIView(wrapperView),并且该包装器视图内部具有TextView和ImageView。
这个简单的结构是通过界面构建器创建的,并具有所有需要的约束,因此可以正常工作。
在某些情况下,我需要以编程方式在ImageView的wrapperView内添加一个UIView(绿色箭头指向那里)。
所以我为新的UIView创建了xib文件,并为其创建了单独的类
class MyView : UIView {
class func instanceFromNib() -> UIView {
return UINib(nibName: "MyView", bundle: nil).instantiate(withOwner: nil, options: nil)[0] as! UIView
}
}
我添加的ViewController代码
let myView = MyView.instanceFromNib()
myView = CGRect(x: 0, y: 0, width: 300, height: 80)
wrapperView.addSubview(myView)
现在我在wrapperView顶部的屏幕上看到myView,但是当我尝试应用类似的约束时
NSLayoutConstraint(item: myView, attribute: .top, relatedBy: .equal, toItem: myImageView, attribute: .bottom, multiplier: 1.0, constant: 8).isActive = true
我有
无法同时满足约束
我究竟做错了什么?
最佳答案
首先,您需要设置以下内容:
myView.translatesAutoresizingMaskIntoConstraints = false
然后,您必须确保自己的约束没有冲突。在情节提要中,您可能添加了将
imageView.bottomAnchor
绑定到wrapperView.bottomAnchor
的约束。现在,如果您在这两个锚点之间放置另一个视图,则需要停用该约束。否则,如果尝试在此处挤压
myView
,可能会导致约束冲突-想象有一个约束说imageView.bottomAnchor
应该是wrapperView.bottomAnchor
的10分,但是还有两个约束说
imageView.bottomAnchor
应该是myView.topAnchor
的10分,而myView.bottomAnchor
应该是wrapperView.bottomAnchor
的10分。显然,这两种情况都无法满足。