Autolayout不工作 - 子视图大小始终为0,而​​它应与Superview具有相同的大小

时间:2017-11-02 05:53:43

标签: cocoa autolayout

对于自动布局,我对NSView有一个奇怪的行为。

我通过以下代码将我唯一的孩子观看到超视图的大小:

   func fillHorizontal() {
        guard let sv = self.superview else {
            assert(false)
            return
        }
        self.translatesAutoresizingMaskIntoConstraints = false

        sv.addConstraint(NSLayoutConstraint(
                item: self, attribute: .width,
                relatedBy: .equal, toItem: sv,
                attribute: .width, multiplier: 1, constant: 0))
        sv.addConstraint(NSLayoutConstraint(
                item: self, attribute: .left,
                relatedBy: .equal, toItem: sv,
                attribute: .left, multiplier: 1, constant: 0))
    }

    func fillVertical() {
        guard let sv = self.superview else {
            assert(false)
            return
        }
        self.translatesAutoresizingMaskIntoConstraints = false
        sv.addConstraint(NSLayoutConstraint(
                item: self, attribute: .height,
                relatedBy: .equal, toItem: sv,
                attribute: .height, multiplier: 1, constant: 0))
        sv.addConstraint(NSLayoutConstraint(
                item: self, attribute: .top,
                relatedBy: .equal, toItem: sv,
                attribute: .top, multiplier: 1, constant: 0))
    }

    func bindFrameToSuperviewBounds() {
        fillHorizontal()
        fillVertical()
    }

由此产生的约束正如我所料 enter image description here

但是,我从来没有能够看到子视图(GraphView)。在子视图中开始调试/调整setFrameSize函数时,如下所示:

override func setFrameSize(_ newSize: NSSize) {
    if let superSize = self.superview?.frame.size, newSize == superSize {  //this is quite dodgy. Not sure why I get too many zero-sized initiations.
        super.setFrameSize(newSize)
    }
}

然后很明显,所有布局引擎总是为子视图计算大小0。

enter image description here

怎么会这样?谁可以告诉我我的错误?非常感谢提前!

1 个答案:

答案 0 :(得分:1)

Kamil Szostakowski提出了正确的问题。 Autolayout不适用于手动大小设置。我需要通过约束设置NSView帧大小。 谢谢卡米尔。