【问题标题】:Swift UIButton override, setImage is not workingSwift UIButton 覆盖,setImage 不起作用
【发布时间】:2015-08-31 16:17:52
【问题描述】:

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

【问题讨论】:

    标签: ios objective-c swift uibutton uiimage


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      -- 编辑--

      如果你想重用样式配置,更好的方法是定义自己的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)
      

      【讨论】:

      • 感谢您的回复。我收到以下错误:Cannot assign to buttonType in self.
      • 明白了。这就是我发现的,但希望我能绕过它(因为我已经编写了代码)。感谢您的帮助。
      • @NoahLabhart 我编辑了我的答案并添加了一个解决方法,您无需大量更改代码,但结果相同。请看。也许是最合适的方式:)
      • 谢谢,这看起来不错。我认为这可行,但我恢复到 UIImageViews。如果这些不起作用,我将备份并尝试一下。
      • 谢谢,您的回答让我意识到:只要“其他人”设置图像,它就可以工作。所以我尝试了一种不同的方法,从内联类中设置 UIButton 的图像(见下面的答案)
      猜你喜欢
      • 2018-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多