约束导致模糊的布局

时间:2016-12-22 07:01:43

标签: objective-c macos constraints

我有NSWindow个实例,其中有setupUi方法。

-(void) setupUi {
    NSView* subView = [[NSView alloc] initWithFrame:NSZeroRect];
    subView.wantsLayer = YES;
    subView.layer.backgroundColor = [[NSColor greenColor] CGColor];
    [self.contentView addSubview:subView];
    [self.contentView setTranslatesAutoresizingMaskIntoConstraints:NO];
    [self.contentView addConstraint:[NSLayoutConstraint constraintWithItem:self.contentView
                              attribute:NSLayoutAttributeLeading
                              relatedBy:NSLayoutRelationEqual
                                 toItem:subView
                              attribute:NSLayoutAttributeLeading
                             multiplier:1
                               constant:0]];
    [self.contentView addConstraint:[NSLayoutConstraint constraintWithItem:self.contentView
                              attribute:NSLayoutAttributeTop
                              relatedBy:NSLayoutRelationEqual
                                 toItem:subView
                              attribute:NSLayoutAttributeTop
                             multiplier:1
                               constant:0]];
    [self.contentView addConstraint:[NSLayoutConstraint constraintWithItem:self.contentView
                              attribute:NSLayoutAttributeTrailing
                              relatedBy:NSLayoutRelationEqual
                                 toItem:subView
                              attribute:NSLayoutAttributeTrailing
                             multiplier:1
                               constant:0]];
    [self.contentView addConstraint:[NSLayoutConstraint constraintWithItem:self.contentView
                              attribute:NSLayoutAttributeBottom
                              relatedBy:NSLayoutRelationEqual
                                 toItem:subView
                              attribute:NSLayoutAttributeBottom
                             multiplier:1
                               constant:0]];

}

当我拨打[self.contentView hasAmbiguousLayout]时,它会返回YES。为什么会这样?此代码段似乎与Xib在使用pin面板时为我们创建的内容相同。

窗口中没有出现绿色的子视图。

提前致谢。

1 个答案:

答案 0 :(得分:0)

NSWindow 的contentView的 translatesAutoresizingMaskIntoConstraints 的属性默认为YES。我无法猜测,如果我将其设置为NO,我对 Frame AutoResizingMask AutoLayout 的了解会发生什么,因为行为我试过让我非常困惑。

总之,请将顶级contentView的translatesAutoresizingMaskIntoConstraints保留为YES,但如果我只想使用 AutoLayout ,则将所有其他子视图保留为NO。

创建视图时,使用autoResizingMask为0构造它,并转换为YES的AutoresizingMaskIntoConstraints。如果translatesAutoresizingMaskIntoConstraints为YES,它将使用Frame,autoResizingMask甚至约束(AutoLayout)来定位视图。

考虑以下情况。

NSView* subView = [[NSView alloc] initWithFrame:NSMakeRect(100, 100, 200, 200)];
subView.wantsLayer = YES;
subView.layer.backgroundColor = [[NSColor greenColor] CGColor];
[subView setTranslatesAutoresizingMaskIntoConstraints:YES];
[self.contentView addSubview:subView];

[subView addConstraint:[NSLayoutConstraint constraintWithItem:subView
                          attribute:NSLayoutAttributeWidth
                          relatedBy:NSLayoutRelationEqual
                             toItem:nil
                          attribute:NSLayoutAttributeNotAnAttribute
                         multiplier:1
                           constant:50]];
[subView addConstraint:[NSLayoutConstraint constraintWithItem:subView
                          attribute:NSLayoutAttributeHeight
                          relatedBy:NSLayoutRelationEqual
                             toItem:nil
                          attribute:NSLayoutAttributeNotAnAttribute
                         multiplier:1
                           constant:50]];

subView的translatesAutoresizingMaskIntoConstraints为YES。然后它将使用Point(100,100)来定位它。它将使用Size(200,200)来调整大小。它将创建NSAutoresizingMaskLayoutConstraint以使其不可调整,因为默认的autoResizingMask为0,这意味着视图不能更改其宽度和高度。它还将使用autoLayout创建NSLayoutConstraint,因为您已调用" addConstraint"。它也会破坏NSLayoutConstraint,因为你的NSLayoutConstraint和NSAutoresizingMaskLayoutConstraint是冲突的。太可怕了。

但是如果你调用 [subView setTranslatesAutoresizingMaskIntoConstraints:NO] ,它将不会使用Point,Size,NSAutoresizingMaskLayoutConstraint,它只会将NSLayoutConstraint与autoLayout一起使用。因为你只是它的大小,而不是它的位置。所以这是一个模棱两可的布局。太可怕了。

以下代码为True。

NSView* subView = [[NSView alloc] initWithFrame:NSMakeRect(100, 100, 200, 200)];
subView.wantsLayer = YES;
subView.layer.backgroundColor = [[NSColor greenColor] CGColor];
[subView setTranslatesAutoresizingMaskIntoConstraints:NO];
[self.contentView addSubview:subView];

[subView addConstraint:[NSLayoutConstraint constraintWithItem:subView
                          attribute:NSLayoutAttributeWidth
                          relatedBy:NSLayoutRelationEqual
                             toItem:nil
                          attribute:NSLayoutAttributeNotAnAttribute
                         multiplier:1
                           constant:50]];
[subView addConstraint:[NSLayoutConstraint constraintWithItem:subView
                          attribute:NSLayoutAttributeHeight
                          relatedBy:NSLayoutRelationEqual
                             toItem:nil
                          attribute:NSLayoutAttributeNotAnAttribute
                         multiplier:1
                           constant:50]];
[self.conteView addConstraint:[NSLayoutConstraint constraintWithItem:subView
                          attribute:NSLayoutAttributeLeading
                          relatedBy:NSLayoutRelationEqual
                             toItem:self.contentView
                          attribute:NSLayoutAttributeLeading
                         multiplier:1
                           constant:0]];
[self.conteView addConstraint:[NSLayoutConstraint constraintWithItem:subView
                          attribute:NSLayoutAttributeTop
                          relatedBy:NSLayoutRelationEqual
                             toItem:self.contentView
                          attribute:NSLayoutAttributeTop
                         multiplier:1
                           constant:0]];

我认为可可的布局是如此可怕,有很多原因。

在Qt中,QHBoxLayout可以非常轻松地完成。不要告诉我在可可中有NSStackView,当它出错而没有押韵或理由时我觉得非常累。

但我必须与可可合作。

是否有人可以告诉我为什么我无法将contentView的translatesAutoresizingMaskIntoConstraints设置为NO?

提前致谢。