【问题标题】:NSPopUpButton subclass attributedTitleNSPopUpButton 子类属性标题
【发布时间】:2023-03-29 08:15:01
【问题描述】:

我对如何子类化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
        ])
    }
}

【问题讨论】:

    标签: swift macos cocoa appkit


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      来自文档:

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

      【讨论】:

      • 嗯...那么如何更改NSPopUpButton 的按钮部分的字体、颜色、大小等?是的,setTitle 的文档说它只需要一个字符串,这是有道理的,但这并没有告诉我没有办法在其上设置attributedTitle,尤其是考虑到它是NSButton 的子类。
      【解决方案3】:

      正如@Willeke 所指出的,我需要在菜单项本身上设置属性字符串。我想把它设置在按钮上,让菜单项不以相同的字体显示,但我决定接受它。

      我在初始化时遍历菜单中的项目并为每个项目设置样式,然后在添加项目后重新设置。

      这是我的NSPopUpButton 子类和NSAttributedStrings 的最终代码:

      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
                  ])
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2023-04-06
        • 1970-01-01
        • 1970-01-01
        • 2011-06-06
        • 1970-01-01
        • 2020-09-15
        • 2021-03-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多