NSButton文字绘图

时间:2014-08-16 11:27:34

标签: objective-c macos drawrect nsbutton

我正在尝试重新绘制我的NSButton的文本,以便它的位置不同。例如。不是居中,而是偏向低位。

我的xib中有自定义类集和文本集等按钮。让我说我在xib中设置的文本是'Test'。

现在在我的子类中,我使用以下代码:

- (void)drawRect:(NSRect)dirtyRect
{
    // Drawing code here.
    [super drawRect:dirtyRect];

    NSDictionary *attributesDict = [NSDictionary dictionaryWithObjectsAndKeys:
                                    [NSColor whiteColor], NSForegroundColorAttributeName,
                                    [NSFont fontWithName:@"Avenir-Medium" size:12.0f], NSFontAttributeName,
                                    nil];

    NSRect rect;
    rect.size = [[self title] sizeWithAttributes:attributesDict];
    rect.origin.x = roundf( NSMidX([self bounds]) - rect.size.width / 2 );
    rect.origin.y = roundf( NSMidY([self bounds]) - rect.size.height / 4 );
    [[self title] drawInRect:rect withAttributes:attributesDict];
}

这种作品,但有一个大问题。此代码按预期方式获取字符串,并为其提供所有正确的格式,并将其放置在我想要的位置。

但是,它只是添加了第二个字符串。所以在运行之后,我有一个按钮,其中包含我在xib中创建的原始“Test”文本,所有文本都只是一个典型的未修改的NSButton,然后是我的第二个偏移字符串。

我不想在一个按钮中使用两个字符串!如何阻止这种复制,但也能获得一个偏移标题?

感谢。

1 个答案:

答案 0 :(得分:0)

免责声明:以下答案针对的是UIButton,而不是NSButton。可能其中一些是有效的,可能不是一切......

我一直因为不提倡UIButton的子类而受到殴打,但我会再次这样做。原因是:你不知道你会得到什么样的行为,没有保证。您认为您将类型设置为“自定义”?怎么样?没有可写属性,也没有可用于此的init方法。

显然它是有效的,Apple在一个例子中这样做,但我会不断重复:仅仅因为它现在在OS a.b中有效,并不意味着它将在OS a.b.1中起作用。虽然它可能(!)会。

无论如何,您看到字符串现在翻倍的原因是标签仍然是视图层次结构的一部分。您可以执行以下操作之一:从超级视图中删除它,将其颜色设置为清除,将其文本设置为nil,...

无论你做什么,如果你想确保你的自定义drawRect:方法继续工作,你可能需要保持你的标题。

我宁愿设置按钮的attributesTitle来获得所需的结果。

如果你觉得你需要子类,也许会尝试覆盖layoutSubviews以调整标签的位置,但是再次准备好随时感到惊讶