objective-c - 以编程方式使用自动布局对齐 NSView

标签 objective-c cocoa autolayout

我在以编程方式使用自动布局将 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]];
}

enter image description here

但是,如果我尝试使用一些附加约束并排显示两个 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]];

enter image description here

这里可能出了什么问题?

最佳答案

[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/

相关文章:

macos - 按 ID 对核心数据排序

ios - 在 iOS 中以编程方式更改 NSLayoutConstraint 的关系

ios - 在 UIView 中定位 UILabel

ios - 保存或返回到以前的 iOS 场景

ios - UITableView 在滚动时崩溃(内存警告)

ios - 使用 AVAudioPlayer 播放声音时出现问题

objective-c - 与 ValueTransformer 绑定(bind)时 NSColorWell 无法打开

cocoa - 从 NSTask 运行的程序中阻止标准

ios - 使用自动布局在某些单元格中加载图像

iOS 8,自定义字体问题