对齐NSTextField和图像

时间:2014-03-08 18:27:54

标签: cocoa nstableview nstextfield nstextfieldcell nstablecellview

我正在尝试对齐NSTextField和NSImageView ..我的当前代码如下。我尝试了一些不同的方法,包括子类化NSTextFieldCell(在SO上找到),弄乱文本字段的框架,并调整约束,但我无法得到它..无论我做什么,它看起来比如下面的截图..

我还发现,当我不在标签上应用字体时,对齐可以正常工作 - 它与图像垂直对齐。

所以问题是,a)为什么在世界上应用字体搞砸了对齐,以及b)我如何解决这个问题,理想情况是如果我在运行时更改字体,将以适应的方式进行调整。

enter image description here

- (id)initWithFrame:(NSRect)frameRect {
    self = [super initWithFrame:frameRect];
    if (self) {
        NSView *spacer1 = [[NSView alloc] init];
        [spacer1 setTranslatesAutoresizingMaskIntoConstraints:NO];
        [self addSubview:spacer1];

        NSView *spacer2 = [[NSView alloc] init];
        [spacer2 setTranslatesAutoresizingMaskIntoConstraints:NO];
        [self addSubview:spacer2];

        NSImage *icon = [NSImage imageNamed:@"05-arrow-west"];
        NSImageView *iconView = [[NSImageView alloc] init];
        [iconView setTranslatesAutoresizingMaskIntoConstraints:NO];
        [iconView setImage:icon];

        [self addSubview:iconView];

        NSFont *font = [NSFont fontWithName:@"HelveticaNeue-Light" size:14];
        NSTextField *label = [[NSTextField alloc] init];
        [label setTranslatesAutoresizingMaskIntoConstraints:NO];
        [label setEditable:NO];
        [label setSelectable:NO];
        [label setBezeled:NO];
        [label setDrawsBackground:NO];

        [label setFont:font];
        [label setTextColor:[NSColor lightGrayColor]];
        [label setStringValue:@"Test String"];


        [self addSubview:label];

        NSDictionary *views = NSDictionaryOfVariableBindings(iconView, label, spacer1, spacer2);

        [self addConstraints:
                [NSLayoutConstraint constraintsWithVisualFormat:@"H:|[spacer1(>=0)][iconView]-5-[label][spacer2(==spacer1)]|"
                                                        options: 0
                                                        metrics:nil
                                                          views:views]];

        [self addConstraints:
                [NSLayoutConstraint constraintsWithVisualFormat:@"V:|[iconView]|"
                                                        options: 0
                                                        metrics:nil
                                                          views:views]];

        [self addConstraints:
                [NSLayoutConstraint constraintsWithVisualFormat:@"V:|[label]|"
                                                        options: 0
                                                        metrics:nil
                                                          views:views]];

        [self setContentHuggingPriority:200 forOrientation:NSLayoutConstraintOrientationVertical];
        [iconView setContentHuggingPriority:200 forOrientation:NSLayoutConstraintOrientationVertical];
        [label setContentHuggingPriority:200 forOrientation:NSLayoutConstraintOrientationVertical];
    }

    return self;
}

2 个答案:

答案 0 :(得分:1)

这是一个非常常见的问题,与AppKit计算某些字体的错误指标有关。 Helvetica Neue 及其变体易受此问题的影响。 Autolayout取决于intrinsicContentSize的{​​{1}},它使用损坏的指标来计算显示文本的适当大小。我知道解决此问题的唯一方法是在布局约束中使用魔法偏移来手动对齐文本。

答案 1 :(得分:1)

最后,这样做了:

[self addConstraint:[NSLayoutConstraint constraintWithItem:label
                                                          attribute:NSLayoutAttributeBaseline
                                                          relatedBy:NSLayoutRelationEqual
                                                             toItem:iconView
                                                          attribute:NSLayoutAttributeCenterY
                                                         multiplier:1
                                                           constant:0]];