NSButton不会setFont:当图层支持时

时间:2014-02-05 17:12:09

标签: objective-c cocoa core-animation calayer nsbutton

我支持NSButton图层,因为我想使用自定义图像,但这似乎在我需要以编程方式更改字体时禁止使用setFont:方法,就像我注释掉wantsUpdateLayer:updateLayer:的代码,setFont:有效,但是当图层方法在代码中时,它什么都不做。

@implementation AppDelegate

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    self.fontChangeButton = [[CustomButton alloc]initWithFrame:NSMakeRect(82, 60, 190, 113)];
    [self.window.contentView addSubview:self.fontChangeButton];
}

- (IBAction)changeFont:(id)sender {
    [self.fontChangeButton fontChange];
}
@end

@implementation CustomButton

- (void)fontChange{
    [self setFont:[NSFont fontWithName:@"Dosis Bold" size:40]];
}

//when these are commented out, setFont: works, but I need them in for the custom button images
- (BOOL)wantsUpdateLayer{
    return YES;
}
- (void)updateLayer{
    if (self.state == NSOnState) {
        self.layer.contents = [NSImage imageNamed:@"buttonPressed.png"];
    }else
        self.layer.contents = [NSImage imageNamed:@"buttonUnpressed.png"];
}

此主题提供了一种解决方法,但我更愿意理解为什么会发生这种情况并修复它:Can't Change NSButton Font

1 个答案:

答案 0 :(得分:0)

通过重写-wantsUpdateLayer返回YES,您将绕过对-drawRect:的调用。该设施于10.8推出,用于提高效率。

我认为应该澄清两件事:

1 - 您无需覆盖-wantsUpdateLayer以进行图层备份。只需发送-setWantsLayer:YES即可为您的按钮提供图层支持。

2 - 在您的示例中,创建自定义NSButtonCell类可能是您尝试执行的更好的方法。看看Apple's documentation子类化NSControl和这个how to来开始。