NSPopUpButton子类为attributionTitle

时间:2016-04-28 22:08:01

标签: swift macos cocoa appkit

我对我如何继承NSPopUpButton的方式感到困惑,即我无法在按钮上设置attributedTitle,以获得自定义字体,颜色和基线偏移)。

以下代码无效:

class CustomPopUpButton: NSPopUpButton {
    required init?(coder: NSCoder) {
        super.init(coder: coder)
        self.wantsLayer = true
        self.layerContentsRedrawPolicy = .OnSetNeedsDisplay

        self.attributedTitle = NSAttributedString(string: self.title, attributes: [
            NSFontAttributeName: NSFont(name: "Impact", size: 15)!,
            NSForegroundColorAttributeName: NSColor(calibratedRed: 0.2, green: 0.270588235, blue: 0.031372549, alpha: 1),
            NSBaselineOffsetAttributeName: 2
        ])
    }
}

3 个答案:

答案 0 :(得分:3)

NSPopUpButton显示所选菜单项。当您设置菜单项的属性字符串时,弹出按钮将显示属性标题。

答案 1 :(得分:1)

在查看documentation时,您会看到NSPopUpButton仅适用于字符串。

attributedTitle属性仅引用其超类NSButton,因此不由NSPopUpButton本身表示。 但是,要设置标准标题,可以使用setTitle方法。

来自文档:

  

如果接收者显示弹出菜单,则此方法将当前项目更改为具有指定标题的项目,如果尚未存在该项目,则添加该项目。

答案 2 :(得分:0)

正如@Willeke指出的那样,我需要在菜单项本身上设置属性字符串。我想把它设置在按钮上,让菜单项不会以相同的字体显示,但我确定它没问题。

我在初始化时循环浏览菜单中的项目并在每个项目上设置样式,然后在添加项目后重新执行该项目。

以下是我的NSPopUpButton子类的最终代码NSAttributedString

class CustomPopUpButton: NSPopUpButton {
    required init?(coder: NSCoder) {
        super.init(coder: coder)

        setItemStyles()
    }

    override func addItemsWithTitles(itemTitles: [String]) {
        super.addItemsWithTitles(itemTitles)

        setItemStyles()
    }

    private func setItemStyles() {
        for item in self.itemArray {
            item.attributedTitle = NSAttributedString(string: item.title, attributes: [
                NSFontAttributeName: NSFont(name: "Impact", size: 15)!,
                NSForegroundColorAttributeName: NSColor(calibratedRed: 0.2, green: 0.270588235, blue: 0.031372549, alpha: 1),
                NSBaselineOffsetAttributeName: 2
            ])
        }
    }
}