2015-04-02 40 views
0

我产生一些NSButtons程序使用此代码: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,所以如果你很快就写出来,我会非常感激!

回答

1

我读了throgh NSButton的参考指南,它似乎是改变它改变图像的唯一方法。但我已经有了一种使用颜色创建图像的方法。在类文件的顶部添加此extionsion

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

对于尺寸参数,将其设置为你的按钮的大小。

UPDATE *如果你想随机选择的颜色,你可以做到这一点..

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) 

为了让大小去你的故事板,点击此按钮,进入到标尺选项卡。它显示你的按钮的大小。

+0

非常感谢,我知道如何随机挑选颜色,但第一部分太棒了! – 2015-04-02 19:05:10

+0

很高兴帮助你:) – 2015-04-02 19:06:38

0

坏消息是,有恕我直言,没有好的方式着色按钮;他们都有优点和缺点。 大家谁和我一样,感到好奇着色按钮约塞米蒂下我所写的内容可能不是最终引导着色按钮,但绝对是一个强有力的竞争者:

http://www.extelligentcocoa.org/colouring-buttons/

这包括所有样式的按钮,并具有截图几乎任意组合,使用

  • 的backgroundColor
  • 的drawRect
  • 细胞的backgroundColor
  • 单色layerEffect
  • 最大光圈调整layerEffect
  • 图像IB
  • 继承NSButton并添加根据按钮状态

如果任何人能想到的颜色按钮的另一种方式,我的图像设置米有兴趣听到它!

+0

链接已死... – peterflynn 2016-04-17 17:02:13

+0

我的歉意 - 该网站被黑客攻击,我不得不重新安装内容;抱歉错过了这一点。 – 2016-04-30 19:46:49

+0

链接仍然死亡。 – 2016-08-25 22:22:51

1

我这个代码

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 
    } 
} 
+0

非常感谢!这个对我有用 – 2017-10-25 11:18:19

0

好做,这里是我做过什么,当我需要更改按钮的外观:继承它。

// 
// 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 - 我原本这是一个类别,它是增加了变量的categorys(一种易于peasy方式人人都说你不能做到这一点,但每个人都没有意识到,是的,你可以 - 这只是不明显)。

不幸的是,我遇到了一些问题,所以我只是做了它的类 - 并没有理会采取了相关的对象(为什么成功烂摊子?)

无论如何,你应该能够拉出相关的代码来改变任何按钮的背景。