使用笔尖加载自定义视图会导致约束被删除

Loading a custom view with a nib causes constraints being removed

概览
我创建了一个自定义视图 class 和一个关联的笔尖。当我尝试在另一个视图控制器中加载它时,它加载了它但约束被删除了。

我发现了什么
在将其标记为重复之前... 我在 Whosebug 上阅读了很多有相同问题的人的问题,但 swift 中的问题要么没有得到解答,要么无法正常工作。我什么都试过了。

我在做什么
我有一个视图控制器(恰好是一个 keyboardviewcntroller,但在常规控制器上我仍然有问题)和一个关联的笔尖和一个自定义的 uiView 及其关联的笔尖。

let nib = UINib(nibName: "nibbb", bundle: nil)
let objects = nib.instantiate(withOwner: self, options: nil)
view = objects[0] as? UIView
    @IBOutlet weak var label: UILabel!
    @IBOutlet weak var button: UIButton!
    
    override init(frame: CGRect) {
            super.init(frame: frame)
            commonInit()
        }
        
        required init?(coder aDecoder: NSCoder) {
            super.init(coder: aDecoder)
            commonInit()
           
        }
        
        private func commonInit(){
            Bundle.main.loadNibNamed("Custom", owner: self, options: nil)
            
            addSubview(label)
            label.frame = self.bounds
           
            label.autoresizingMask = [.flexibleHeight, .flexibleWidth]
            addSubview(button)
            button.frame = self.bounds
           
            button.autoresizingMask = [.flexibleHeight, .flexibleWidth]
        }

}

这是我得到的输出:

当然,这不是我想要的。

问题
如何从另一个视图控制器加载自定义 UIView nib 而不会弄乱我的约束?

您的约束未按预期工作的原因是因为在 commonInit 函数中将标签和按钮设置为与视图大小相同。

你应该声明一个UIView 属性然后替换commonInit函数的内容:

var contentView: UIView!

private func commonInit() {
    if let nib = Bundle.main.loadNibNamed("Custom", owner: self, options:nil)?.first as? UIView {
        contentView = nib
        contentView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
        contentView.frame = bounds
        addSubview(contentView)
    }
}