Swift UIButton覆盖,setImage不起作用

时间:2015-06-16 01:38:16

标签: ios objective-c swift uibutton uiimage

我正在尝试使用我自己的名为UIButton的按钮类继承FlipsSendButton。下面列出了此类的代码。在其中,您可以看到我正在调用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文件夹中,如果这有所不同。

2 个答案:

答案 0 :(得分:9)

您忘记了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()
    }
}

- 编辑 -

如果您想重复使用样式配置,更好的方法是定义自己的{strong>工厂方法 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)

答案 1 :(得分:2)

我发现这也很令人沮丧。一个功能齐全的UIButton子类,它唯一的缺陷是setImage:。 我找到的更简单的解决方案是编写一个小辅助类来从外部设置图像:

class ButtonImageHelper {

    func setImage(image: UIImage?, forButton:UIButton) {
            forButton.setImage(image, forState: UIControlState.Normal)
    }   
}

这个类可以放在你的UIButton子类中 称之为:
ButtonImageHelper().setImage(yourImage, forButton:self)