以编程方式设置 NSButton 的颜色 swift
Set color of NSButton programmatically swift
我使用以下代码以编程方式生成一些 NSButton:
for i in 1...height {
for j in 1...width {
var but = NSButton(frame: NSRect(x: x, y: y + 78, width: 30, height: 30))
but.tag = k
but.title = ""
but.action = Selector("buttonPressed:")
but.target = self
but.bezelStyle = NSBezelStyle(rawValue: 6)!
but.layer?.backgroundColor = NSColor.blackColor().CGColor
var ges = NSClickGestureRecognizer(target: self, action: Selector("addFlag:"))
ges.buttonMask = 0x2
ges.numberOfClicksRequired = 1
but.addGestureRecognizer(ges)
ar.append(but)
self.view.addSubview(but)
x += 30
k++
}
y += 30
x = 0
}
并且我需要将所有按钮的背景颜色设置为灰色或黑色(随机)。我不知道如何获取或设置 NSButton
背景颜色。我对 swift 编程很陌生,我不太了解 obj-c,所以如果你能在 swift 上写它,我将非常感激!
我通读了 NSButton 参考指南,似乎唯一改变它的方法就是改变图像。但是我已经找到了一种使用颜色创建图像的方法。在 class 文件
的顶部添加此扩展
extension NSImage {
class func swatchWithColor(color: NSColor, size: NSSize) -> NSImage {
let image = NSImage(size: size)
image.lockFocus()
color.drawSwatchInRect(NSMakeRect(0, 0, size.width, size.height))
image.unlockFocus()
return image
}
}
这将允许我们稍后使用 UIColour 创建 NSImage。最后,当你想创建你的按钮时,使用我们制作的扩展设置图像。
myButton.image = NSImage.swatchWithColor( NSColor.blackColor(), size: NSMakeSize(100, 100) )
For the size parameter set it to your button's size.
更新*如果你想随机选择颜色,你可以这样做..
var randomIndex = arc4random_uniform(2) + 1 //Creates a random number between 1 and 2
var colour = NSColor() //Empty colour
if randomIndex == 1 {
//If the random number is one then the colour is black
colour = NSColor.blackColor()
}
else {
//Else if it's not one it's grey
colour = NSColor.grayColor()
}
//set the button's image to the new colour
myButton.image = NSImage.swatchWithColor(colour, size: //My button size)
To get the size go to your storyboard, click on your button and go to the ruler tab. There it shows your button's size.
坏消息是,恕我直言,没有好的按钮着色方法;它们都有优点和缺点。
对于像我一样对 Yosemite 下的着色按钮感到好奇的每个人,我写的可能不是着色按钮的最终指南,但绝对是一个强有力的竞争者:
http://www.extelligentcocoa.org/colouring-buttons/
这涵盖了所有样式的按钮,并且有几乎任何组合的屏幕截图,使用
- 背景颜色
- 绘制矩形
- 单元格背景颜色
- 单色图层效果
- whiteBalance 调整layerEffect
- 在 IB 中设置的图像
- 子类化 NSButton 并根据按钮状态添加图像
如果有人能想到另一种为按钮着色的方法,我很想听听!
我正在用这段代码来做
final class MyButton: NSButton {
override func awakeFromNib() {
let layer = CALayer()
layer.backgroundColor = CGColorCreateGenericRGB(59.0/255, 52.0/255.0, 152.0/255.0, 1.0)
self.wantsLayer = true
self.layer = layer
}
}
好的,这是我在需要更改按钮外观时所做的:subclass 它。
//
// LSButtonColor.swift
//
// Created by Lloyd Sargent on 8/26/16.
// Copyright © 2016 Canna Software. All rights reserved.
// License: Permission is hereby granted, free of charge, to any
// person obtaining a copy of this software and associated
// documentation files (the “Software”), to deal in the
// Software without restriction, including without
// limitation the rights to use, copy, modify, merge,
// publish, distribute, sublicense, and/or sell copies of
// the Software, and to permit persons to whom the Software
// is furnished to do so, subject to the following
// conditions:
//
// The above copyright notice and this permission notice
// shall be included in all copies or substantial portions
// of the Software.
//
// THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF
// ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
// TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
// PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
// SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
// IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.
//
import Cocoa
class LSButtonColor: NSButton {
fileprivate struct AssociatedKeys {
static var variableDictionary = "ls_variableDictionary"
}
fileprivate var variableDictionary: [String:AnyObject]! {
get {
var localVariableDictionary = objc_getAssociatedObject(self, &AssociatedKeys.variableDictionary) as! [String:AnyObject]!
if localVariableDictionary == nil {
localVariableDictionary = [String:AnyObject]()
objc_setAssociatedObject(self, &AssociatedKeys.variableDictionary, localVariableDictionary, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
}
return localVariableDictionary
}
set(updatedDictionary) {
objc_setAssociatedObject(self, &AssociatedKeys.variableDictionary, updatedDictionary, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
}
}
var backgroundColor: NSColor! {
get {
return variableDictionary["backgroundColor"] as? NSColor
}
set(newBackgroundColor) {
var localVariableDictionary = variableDictionary
localVariableDictionary?["backgroundColor"] = newBackgroundColor
variableDictionary = localVariableDictionary
}
}
var altBackgroundColor: NSColor! {
get {
return variableDictionary["altBackgroundColor"] as? NSColor
}
set(newAltBackgroundColor) {
var localVariableDictionary = variableDictionary
localVariableDictionary?["altBackgroundColor"] = newAltBackgroundColor
variableDictionary = localVariableDictionary
}
}
var borderColor: NSColor! {
get {
return variableDictionary["borderColor"] as? NSColor
}
set(newBorderColor) {
var localVariableDictionary = variableDictionary
localVariableDictionary?["borderColor"] = newBorderColor
variableDictionary = localVariableDictionary
self.layer?.borderColor = newBorderColor.cgColor
}
}
var cornerRadius: CGFloat {
get {
return variableDictionary["cornerRadius"] as! CGFloat
}
set(newCornerRadius) {
var localVariableDictionary = variableDictionary
localVariableDictionary?["cornerRadius"] = newCornerRadius as AnyObject?
variableDictionary = localVariableDictionary
self.layer?.cornerRadius = newCornerRadius
}
}
var borderWidth: CGFloat {
get {
return variableDictionary["borderWidth"] as! CGFloat
}
set(newBorderWidth) {
var localVariableDictionary = variableDictionary
localVariableDictionary?["borderWidth"] = newBorderWidth as AnyObject?
variableDictionary = localVariableDictionary
self.layer?.borderWidth = newBorderWidth
}
}
override func draw(_ dirtyRect: NSRect) {
super.draw(dirtyRect)
// Drawing code here.
if self.isHighlighted {
if self.layer != nil {
self.layer?.backgroundColor = self.altBackgroundColor.cgColor
}
}
else {
if self.layer != nil {
self.layer?.backgroundColor = self.backgroundColor.cgColor
}
}
}
}
好吧,您可能首先感到困惑的是 objc_getAssociatedObject
- 最初我将其作为一个类别来执行,这是一种向类别添加变量的简单方法(每个人都说您不能去做,但每个人都没有意识到,是的,你可以——只是不明显。
不幸的是,我 运行 遇到了一些问题,所以我只是把它变成了 class - 而没有费心去取出关联的对象(为什么要成功?)
不管怎样,你应该可以把相关代码拉出来,改变任意按钮的背景。
我使用以下代码以编程方式生成一些 NSButton:
for i in 1...height {
for j in 1...width {
var but = NSButton(frame: NSRect(x: x, y: y + 78, width: 30, height: 30))
but.tag = k
but.title = ""
but.action = Selector("buttonPressed:")
but.target = self
but.bezelStyle = NSBezelStyle(rawValue: 6)!
but.layer?.backgroundColor = NSColor.blackColor().CGColor
var ges = NSClickGestureRecognizer(target: self, action: Selector("addFlag:"))
ges.buttonMask = 0x2
ges.numberOfClicksRequired = 1
but.addGestureRecognizer(ges)
ar.append(but)
self.view.addSubview(but)
x += 30
k++
}
y += 30
x = 0
}
并且我需要将所有按钮的背景颜色设置为灰色或黑色(随机)。我不知道如何获取或设置 NSButton
背景颜色。我对 swift 编程很陌生,我不太了解 obj-c,所以如果你能在 swift 上写它,我将非常感激!
我通读了 NSButton 参考指南,似乎唯一改变它的方法就是改变图像。但是我已经找到了一种使用颜色创建图像的方法。在 class 文件
的顶部添加此扩展extension NSImage {
class func swatchWithColor(color: NSColor, size: NSSize) -> NSImage {
let image = NSImage(size: size)
image.lockFocus()
color.drawSwatchInRect(NSMakeRect(0, 0, size.width, size.height))
image.unlockFocus()
return image
}
}
这将允许我们稍后使用 UIColour 创建 NSImage。最后,当你想创建你的按钮时,使用我们制作的扩展设置图像。
myButton.image = NSImage.swatchWithColor( NSColor.blackColor(), size: NSMakeSize(100, 100) )
For the size parameter set it to your button's size.
更新*如果你想随机选择颜色,你可以这样做..
var randomIndex = arc4random_uniform(2) + 1 //Creates a random number between 1 and 2
var colour = NSColor() //Empty colour
if randomIndex == 1 {
//If the random number is one then the colour is black
colour = NSColor.blackColor()
}
else {
//Else if it's not one it's grey
colour = NSColor.grayColor()
}
//set the button's image to the new colour
myButton.image = NSImage.swatchWithColor(colour, size: //My button size)
To get the size go to your storyboard, click on your button and go to the ruler tab. There it shows your button's size.
坏消息是,恕我直言,没有好的按钮着色方法;它们都有优点和缺点。 对于像我一样对 Yosemite 下的着色按钮感到好奇的每个人,我写的可能不是着色按钮的最终指南,但绝对是一个强有力的竞争者:
http://www.extelligentcocoa.org/colouring-buttons/
这涵盖了所有样式的按钮,并且有几乎任何组合的屏幕截图,使用
- 背景颜色
- 绘制矩形
- 单元格背景颜色
- 单色图层效果
- whiteBalance 调整layerEffect
- 在 IB 中设置的图像
- 子类化 NSButton 并根据按钮状态添加图像
如果有人能想到另一种为按钮着色的方法,我很想听听!
我正在用这段代码来做
final class MyButton: NSButton {
override func awakeFromNib() {
let layer = CALayer()
layer.backgroundColor = CGColorCreateGenericRGB(59.0/255, 52.0/255.0, 152.0/255.0, 1.0)
self.wantsLayer = true
self.layer = layer
}
}
好的,这是我在需要更改按钮外观时所做的:subclass 它。
//
// LSButtonColor.swift
//
// Created by Lloyd Sargent on 8/26/16.
// Copyright © 2016 Canna Software. All rights reserved.
// License: Permission is hereby granted, free of charge, to any
// person obtaining a copy of this software and associated
// documentation files (the “Software”), to deal in the
// Software without restriction, including without
// limitation the rights to use, copy, modify, merge,
// publish, distribute, sublicense, and/or sell copies of
// the Software, and to permit persons to whom the Software
// is furnished to do so, subject to the following
// conditions:
//
// The above copyright notice and this permission notice
// shall be included in all copies or substantial portions
// of the Software.
//
// THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF
// ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
// TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
// PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
// SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
// IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.
//
import Cocoa
class LSButtonColor: NSButton {
fileprivate struct AssociatedKeys {
static var variableDictionary = "ls_variableDictionary"
}
fileprivate var variableDictionary: [String:AnyObject]! {
get {
var localVariableDictionary = objc_getAssociatedObject(self, &AssociatedKeys.variableDictionary) as! [String:AnyObject]!
if localVariableDictionary == nil {
localVariableDictionary = [String:AnyObject]()
objc_setAssociatedObject(self, &AssociatedKeys.variableDictionary, localVariableDictionary, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
}
return localVariableDictionary
}
set(updatedDictionary) {
objc_setAssociatedObject(self, &AssociatedKeys.variableDictionary, updatedDictionary, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
}
}
var backgroundColor: NSColor! {
get {
return variableDictionary["backgroundColor"] as? NSColor
}
set(newBackgroundColor) {
var localVariableDictionary = variableDictionary
localVariableDictionary?["backgroundColor"] = newBackgroundColor
variableDictionary = localVariableDictionary
}
}
var altBackgroundColor: NSColor! {
get {
return variableDictionary["altBackgroundColor"] as? NSColor
}
set(newAltBackgroundColor) {
var localVariableDictionary = variableDictionary
localVariableDictionary?["altBackgroundColor"] = newAltBackgroundColor
variableDictionary = localVariableDictionary
}
}
var borderColor: NSColor! {
get {
return variableDictionary["borderColor"] as? NSColor
}
set(newBorderColor) {
var localVariableDictionary = variableDictionary
localVariableDictionary?["borderColor"] = newBorderColor
variableDictionary = localVariableDictionary
self.layer?.borderColor = newBorderColor.cgColor
}
}
var cornerRadius: CGFloat {
get {
return variableDictionary["cornerRadius"] as! CGFloat
}
set(newCornerRadius) {
var localVariableDictionary = variableDictionary
localVariableDictionary?["cornerRadius"] = newCornerRadius as AnyObject?
variableDictionary = localVariableDictionary
self.layer?.cornerRadius = newCornerRadius
}
}
var borderWidth: CGFloat {
get {
return variableDictionary["borderWidth"] as! CGFloat
}
set(newBorderWidth) {
var localVariableDictionary = variableDictionary
localVariableDictionary?["borderWidth"] = newBorderWidth as AnyObject?
variableDictionary = localVariableDictionary
self.layer?.borderWidth = newBorderWidth
}
}
override func draw(_ dirtyRect: NSRect) {
super.draw(dirtyRect)
// Drawing code here.
if self.isHighlighted {
if self.layer != nil {
self.layer?.backgroundColor = self.altBackgroundColor.cgColor
}
}
else {
if self.layer != nil {
self.layer?.backgroundColor = self.backgroundColor.cgColor
}
}
}
}
好吧,您可能首先感到困惑的是 objc_getAssociatedObject
- 最初我将其作为一个类别来执行,这是一种向类别添加变量的简单方法(每个人都说您不能去做,但每个人都没有意识到,是的,你可以——只是不明显。
不幸的是,我 运行 遇到了一些问题,所以我只是把它变成了 class - 而没有费心去取出关联的对象(为什么要成功?)
不管怎样,你应该可以把相关代码拉出来,改变任意按钮的背景。