以下是在 Marc Marset 描述的代码中创建 NSButton 的技术的修改(上面引用过),应该满足您的要求。 'customNSButton' 功能将允许创建多个按钮,并通过 Target-Action 为每个按钮设置个性化操作。计时器用于“眨眼”背景颜色,并在按钮下方创建阴影。标题是属性文本。
import Cocoa
class AppDelegate: NSObject, NSApplicationDelegate {
var window:NSWindow!
var button:NSButton!
@objc func resetBkgrndColor(_ sender:AnyObject) {
let backgroundColor: NSColor = .white
button.layer?.backgroundColor = backgroundColor.cgColor
}
@objc func myBtnAction(_ sender:AnyObject ) {
let backgroundColor: NSColor = .white
button.layer?.backgroundColor = backgroundColor.blended( withFraction: 0.2, of: .black )?.cgColor
Timer.scheduledTimer(timeInterval:0.25, target:self, selector:#selector(self.resetBkgrndColor(_:)), userInfo:nil, repeats:false)
NSSound.beep()
}
func customNSButton( bkgrndColor: NSColor?, borderColor: NSColor?, borderWidth: CGFloat?, cornerRadius: CGFloat? ) -> NSButton {
button = NSButton()
button.wantsLayer = true
button.layer?.backgroundColor = bkgrndColor?.cgColor ?? .clear
button.layer?.masksToBounds = true
button.layer!.cornerRadius = cornerRadius ?? 0
button.layer!.borderColor = borderColor?.cgColor
button.layer!.borderWidth = borderWidth ?? 0
button.layer?.shadowOffset = CGSize(width: 8, height: 18)
button.layer?.shadowColor = .black
button.layer?.shadowRadius = 9
button.layer?.masksToBounds = false
button.layer?.shadowOpacity = 0.5
return button
}
func buildMenu() {
let mainMenu = NSMenu()
NSApp.mainMenu = mainMenu
// **** App menu **** //
let appMenuItem = NSMenuItem()
mainMenu.addItem(appMenuItem)
let appMenu = NSMenu()
appMenuItem.submenu = appMenu
appMenu.addItem(withTitle: "Quit", action:#selector(NSApplication.terminate), keyEquivalent: "q")
}
func buildWnd() {
let _wndW : CGFloat = 400
let _wndH : CGFloat = 300
window = NSWindow(contentRect:NSMakeRect(0,0,_wndW,_wndH),styleMask:[.titled, .closable, .miniaturizable, .resizable], backing:.buffered, defer:false)
window.center()
window.title = "Swift Test Window"
window.makeKeyAndOrderFront(window)
// **** Custom Button **** //
let myBtn = customNSButton(bkgrndColor:.white, borderColor:.black, borderWidth:2, cornerRadius:22)
myBtn.frame = NSMakeRect(60,120,300,40)
myBtn.bezelStyle = .roundRect
myBtn.isBordered = false
myBtn.attributedTitle = NSAttributedString(string: "Btn Text", attributes: [.foregroundColor: NSColor.red, .font:NSFont(name:"Menlo Bold", size:28)])
myBtn.action = #selector(self.myBtnAction(_:))
window.contentView!.addSubview(myBtn)
// **** Quit btn **** //
let quitBtn = NSButton (frame:NSMakeRect( _wndW - 50, 10, 40, 40 ))
quitBtn.bezelStyle = .circular
quitBtn.autoresizingMask = [.minXMargin,.maxYMargin]
quitBtn.title = "Q"
quitBtn.action = #selector(NSApplication.terminate)
window.contentView!.addSubview(quitBtn)
}
func applicationDidFinishLaunching(_ notification: Notification) {
buildMenu()
buildWnd()
}
func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool {
return true
}
}
let appDelegate = AppDelegate()
// **** main.swift **** //
let app = NSApplication.shared
app.delegate = appDelegate
app.setActivationPolicy(.regular)
app.activate(ignoringOtherApps:true)
app.run()