NSButton是macOS开发中常用的控件,用于创建按钮。它有许多用法和需要注意的事项,下面介绍其中的一些。

1. 创建按钮:使用init(frame:)或init(title:action:)初始化按钮

let button = NSButton(frame: NSRect(x: 0, y: 0, width: 100, height: 40))
let button = NSButton(title: "Click me", target: self, action: #selector(buttonClicked(_:)))

2. 设置按钮类型:使用setButtonType(_:)方法设置按钮类型,例如圆形、方形等

button.setButtonType(.pushOnPushOff) // 圆形开关按钮
button.setButtonType(.momentaryChange) // 短暂变化按钮

3. 设置标题:使用setTitle(_:), setAttributedTitle(_:)或setTitleWithMnemonic(_:)方法设置按钮标题

button.setTitle("OK")
let attributes: [NSAttributedString.Key: Any] = [.foregroundColor: NSColor.red]
button.setAttributedTitle(NSAttributedString(string: "Cancel", attributes: attributes))

4. 禁用按钮:使用setEnabled(_:)方法禁用按钮,禁用后按钮会显示为灰色

button.isEnabled = false

5. 按钮动作:使用setAction(_:)和setTarget(_:)方法来设置按钮点击后执行的方法和对象

button.target = self
button.action = #selector(buttonClicked(_:))

@objc func buttonClicked(_ sender: NSButton) {
    print("Button clicked!")
}

6. 设置图片:使用setImage(_:)和setAlternateImage(_:)方法设置按钮的图像和替代图像

button.image = NSImage(named: "Icon")
button.alternateImage = NSImage(named: "Icon_selected")

7. 设置按钮状态:使用setState(_:)方法设置按钮的状态,可以是正常、选中或混合状态

button.state = .on // 充当开关按钮使用,设置按钮为选中状态

8. 设置键盘快捷键:使用setKeyEquivalent(_:), setKeyEquivalentModifierMask(_:)和performKeyEquivalent(_:)方法来设置按钮的键盘快捷键

button.keyEquivalent = "\r" // 回车键
button.keyEquivalentModifierMask = [.command, .shift] // 快捷键修饰符,同时按下 Command 和 Shift 键触发

NSButton的背景颜色和字体大小可以通过设置按钮的cell属性来实现。具体操作方法如下:

9. 设置背景颜色

要设置NSButton的背景颜色,需要创建一个NSButtonCell对象,并设置其backgroundColor属性。然后将该NSButtonCell对象赋值给NSButton的cell属性即可。

let button = NSButton(frame: NSRect(x: 0, y: 0, width: 100, height: 40))
let cell = button.cell as! NSButtonCell
cell.backgroundColor = .red

10. 设置字体大小

要设置NSButton的字体大小,同样需要创建一个NSButtonCell对象,并设置其font属性。然后将该NSButtonCell对象赋值给NSButton的cell属性即可。

let button = NSButton(frame: NSRect(x: 0, y: 0, width: 100, height: 40))
let cell = button.cell as! NSButtonCell
cell.font = NSFont.systemFont(ofSize: 20)

11. 更改形状

        (1)子类化NSButton并实现自定义形状。

          创建一个自定义的NSButton子类,并在其中覆盖draw(_ dirtyRect: NSRect)方法以绘制自定义形状。例如,一个绘制红色圆形的自定义NSButton子类CircleButton:

class CircleButton: NSButton {
    override func draw(_ dirtyRect: NSRect) {
        let path = NSBezierPath(ovalIn: bounds)
        NSColor.red.setFill()
        path.fill()
    }
}

        (2) 使用Core Animation图层和自定义形状

        使用Core Animation图层来创建自定义形状的按钮。可以使用CALayer的cornerRadius属性设置圆角,或者使用mask属性指定一个alpha通道图像来裁剪按钮的形状。例如,创建一个椭圆形的按钮:

let button = NSButton(frame: NSRect(x: 0, y: 0, width: 100, height: 50))
button.wantsLayer = true
button.layer?.cornerRadius = 25
button.layer?.backgroundColor = NSColor.red.cgColor

        在方法2中,我们将NSButton的wantsLayer属性设置为true,这将启用Core Animation图层。然后,我们设置按钮图层的cornerRadius属性为25,这将使按钮显示为椭圆形。最后,我们设置按钮图层的backgroundColor属性为红色,以使其显示为红色椭圆形。        

12. 需要注意的事项:

- 当使用setButtonType(.pushOnPushOff)设置按钮类型时,需要使用setPeriodicDelay(_:interval:)方法设置按钮重复点击延迟和重复点击间隔
- 如果使用init(title:action:)方法初始化按钮并指定了动作方法,则动作方法必须在目标对象中实现,并且接受一个参数:sender:NSButton
- 在设置按钮快捷键时,需要注意不要与其他快捷键冲突,否则会导致快捷键无法正常使用