Swift UIButton 覆盖,setImage 不工作
Swift UIButton override, setImage is not working
我正在尝试使用我自己的名为 FlipsSendButton
的按钮 class 来替代 class UIButton
。下面列出了此 class 的代码。在其中您可以看到我正在调用 setImage
来尝试设置按钮图像。但是,编译后,除了设置图像视图外,一切正常。
我是否在我的代码中遗漏了一些设置图像的步骤,或者可能错误地调用了可选和展开运算符?
import Foundation
class FlipSendButton : UIButton {
let bgColor : UIColor
init(frame aFrame: CGRect, bgColor aColor: UIColor) {
bgColor = aColor;
super.init(frame: aFrame)
addTarget(self, action: Selector("buttonTouched:"), forControlEvents: .TouchUpInside)
backgroundColor = aColor;
setImage(UIImage(named: "flips.png") as UIImage?, forState: .Normal)
}
required init(coder aDecoder: NSCoder) {
bgColor = UIColor.lightGrayColor()
super.init(coder: aDecoder)
}
func buttonTouched(sender: UIButton) {
if backgroundColor == UIColor.lightGrayColor() {
backgroundColor = bgColor
} else {
backgroundColor = UIColor.lightGrayColor()
}
}
}
此外,值得一提的是,图像 flips.png 在我的 images.xassets 文件夹中,如果这有什么区别的话。
您忘记了 buttonType
属性。此外,你最好不要继承 UIButton
(查看 this 的原因)。
相反,您应该在初始化按钮时将 buttonType
属性 设置为 UIButtonTypeCustom
,一些示例代码:
var myButton = UIButton.buttonWithType(.UIButtonTypeCustom)
myButton.setImage(UIImage(named: "flips.png") as UIImage?, forState: .Normal)
myButton.addTarget(self, action: Selector("buttonTouched:"), forControlEvents: .TouchUpInside)
func buttonTouched(sender: UIButton) {
if sender.backgroundColor == UIColor.lightGrayColor() {
sender.backgroundColor = bgColor
} else {
sender.backgroundColor = UIColor.lightGrayColor()
}
}
-- 编辑--
如果要重用样式配置,更好的方法是定义自己的工厂方法 of UIButton
。类似于:
import Foundation
import UIKit
import ObjectiveC
private var bgColorKey: UInt8 = 0
extension UIButton {
var bgColor: UIColor {
get {
return objc_getAssociatedObject(self, &bgColorKey) as! UIColor
}
set (neewColor) {
objc_setAssociatedObject(self, &bgColorKey, neewColor, .OBJC_ASSOCIATION_RETAIN)
}
}
class func buttonWithFrame(f: CGRect, backgroundColor color: UIColor) -> UIButton {
let button = UIButton(type: .Custom)
button.frame = f
button.backgroundColor = color;
button.bgColor = color
button.setImage(UIImage(named: "flips.png") as UIImage?, forState: .Normal)
button.addTarget(button, action: "buttonTouched:", forControlEvents: .TouchUpInside)
return button
}
func buttonTouched(sender: UIButton) {
if sender.backgroundColor == UIColor.lightGrayColor() {
sender.backgroundColor = sender.bgColor
} else {
sender.backgroundColor = UIColor.lightGrayColor()
}
}
}
然后你可以像这样使用按钮:
var btn = UIButton.buttonWithFrame(CGRectMake(50, 50, 100, 50), backgroundColor: UIColor.greenColor())
self.view.addSubview(btn)
我也觉得这很令人沮丧。一个功能齐全的 UIButton subclass,唯一的缺陷是 setImage:
。
我找到的更简单的解决方案是编写一个小助手 class 从外部设置图像:
class ButtonImageHelper {
func setImage(image: UIImage?, forButton:UIButton) {
forButton.setImage(image, forState: UIControlState.Normal)
}
}
这个 class 可以放在你的 UIButton subclass 中。
调用它:
ButtonImageHelper().setImage(yourImage, forButton:self)
我正在尝试使用我自己的名为 FlipsSendButton
的按钮 class 来替代 class UIButton
。下面列出了此 class 的代码。在其中您可以看到我正在调用 setImage
来尝试设置按钮图像。但是,编译后,除了设置图像视图外,一切正常。
我是否在我的代码中遗漏了一些设置图像的步骤,或者可能错误地调用了可选和展开运算符?
import Foundation
class FlipSendButton : UIButton {
let bgColor : UIColor
init(frame aFrame: CGRect, bgColor aColor: UIColor) {
bgColor = aColor;
super.init(frame: aFrame)
addTarget(self, action: Selector("buttonTouched:"), forControlEvents: .TouchUpInside)
backgroundColor = aColor;
setImage(UIImage(named: "flips.png") as UIImage?, forState: .Normal)
}
required init(coder aDecoder: NSCoder) {
bgColor = UIColor.lightGrayColor()
super.init(coder: aDecoder)
}
func buttonTouched(sender: UIButton) {
if backgroundColor == UIColor.lightGrayColor() {
backgroundColor = bgColor
} else {
backgroundColor = UIColor.lightGrayColor()
}
}
}
此外,值得一提的是,图像 flips.png 在我的 images.xassets 文件夹中,如果这有什么区别的话。
您忘记了 buttonType
属性。此外,你最好不要继承 UIButton
(查看 this 的原因)。
相反,您应该在初始化按钮时将 buttonType
属性 设置为 UIButtonTypeCustom
,一些示例代码:
var myButton = UIButton.buttonWithType(.UIButtonTypeCustom)
myButton.setImage(UIImage(named: "flips.png") as UIImage?, forState: .Normal)
myButton.addTarget(self, action: Selector("buttonTouched:"), forControlEvents: .TouchUpInside)
func buttonTouched(sender: UIButton) {
if sender.backgroundColor == UIColor.lightGrayColor() {
sender.backgroundColor = bgColor
} else {
sender.backgroundColor = UIColor.lightGrayColor()
}
}
-- 编辑--
如果要重用样式配置,更好的方法是定义自己的工厂方法 of UIButton
。类似于:
import Foundation
import UIKit
import ObjectiveC
private var bgColorKey: UInt8 = 0
extension UIButton {
var bgColor: UIColor {
get {
return objc_getAssociatedObject(self, &bgColorKey) as! UIColor
}
set (neewColor) {
objc_setAssociatedObject(self, &bgColorKey, neewColor, .OBJC_ASSOCIATION_RETAIN)
}
}
class func buttonWithFrame(f: CGRect, backgroundColor color: UIColor) -> UIButton {
let button = UIButton(type: .Custom)
button.frame = f
button.backgroundColor = color;
button.bgColor = color
button.setImage(UIImage(named: "flips.png") as UIImage?, forState: .Normal)
button.addTarget(button, action: "buttonTouched:", forControlEvents: .TouchUpInside)
return button
}
func buttonTouched(sender: UIButton) {
if sender.backgroundColor == UIColor.lightGrayColor() {
sender.backgroundColor = sender.bgColor
} else {
sender.backgroundColor = UIColor.lightGrayColor()
}
}
}
然后你可以像这样使用按钮:
var btn = UIButton.buttonWithFrame(CGRectMake(50, 50, 100, 50), backgroundColor: UIColor.greenColor())
self.view.addSubview(btn)
我也觉得这很令人沮丧。一个功能齐全的 UIButton subclass,唯一的缺陷是 setImage:
。
我找到的更简单的解决方案是编写一个小助手 class 从外部设置图像:
class ButtonImageHelper {
func setImage(image: UIImage?, forButton:UIButton) {
forButton.setImage(image, forState: UIControlState.Normal)
}
}
这个 class 可以放在你的 UIButton subclass 中。
调用它:
ButtonImageHelper().setImage(yourImage, forButton:self)