我在以编程方式使用自动布局将 NSView 彼此相邻对齐时遇到问题。为了说明这一点,我做了一个非常简单的示例项目。 DiscView是NSView的子类,它用指定的颜色绘制圆盘。
在下面的示例中,我仅在两个 subview 之一上添加自动布局约束,结果正如我所预期的那样(请参见下面的屏幕截图)。
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
DiscView *discViewA = [[DiscView alloc] init];
DiscView *discViewB = [[DiscView alloc] init];
discViewA.color = [NSColor blackColor];
discViewB.color = [NSColor redColor];
discViewA.translatesAutoresizingMaskIntoConstraints = NO;
discViewB.translatesAutoresizingMaskIntoConstraints = NO;
[self.customView addSubview:discViewA];
[self.customView addSubview:discViewB];
NSDictionary *discViewDictionary = @{@"discViewA" : discViewA,
@"discViewB" : discViewB};
[self.customView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[discViewA]|" options:0
metrics:nil
views:discViewDictionary]];
[self.customView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[discViewA]|" options:0
metrics:nil
views:discViewDictionary]];
}
但是,如果我尝试使用一些附加约束并排显示两个 subview ,我只会看到一个红色圆盘。也就是说,就好像红色圆盘直接绘制在黑色圆盘之上。
[self.customView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[discViewA]-[discViewB]|" options:0
metrics:nil
views:discViewDictionary]];
[self.customView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[discViewA]|" options:0
metrics:nil
views:discViewDictionary]];
[self.customView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[discViewB]|" options:0
metrics:nil
views:discViewDictionary]];
这里可能出了什么问题?
最佳答案
[self.customView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[discViewA][discViewB]|"
options:NSLayoutFormatAlignAllTop | NSLayoutFormatAlignAllBottom
views:discViewDictionary]];
[self.customView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[discViewA]|" options:0
metrics:nil
views:discViewDictionary]];
试试这个。这可能有帮助。如果没有,就按照别人的建议去做,并像这样施加限制。
[self.customView addConstraint:[NSLayoutConstraint constraintWithItem:discViewA
attribute:NSLayoutAttributeWidth
relatedBy:NSLayoutRelationEqual
toItem:self.customView
attribute:NSLayoutAttributeWidth
multiplier:0.5f
constant:0.f]];
关于objective-c - 以编程方式使用自动布局对齐 NSView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22071090/