我有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面板时为我们创建的内容相同。
窗口中没有出现绿色的子视图。
提前致谢。
答案 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?
提前致谢。