我有看起来像这样的ViewController。有父ScrollView持有UIView(wrapperView),并且该包装器视图内部具有TextView和ImageView。
这个简单的结构是通过界面构建​​器创建的,并具有所有需要的约束,因此可以正常工作。

ios - 以编程方式将UiView放置为 subview-LMLPHP

在某些情况下,我需要以编程方式在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分。


显然,这两种情况都无法满足。

10-02 09:27