【问题标题】:iOS Swift 3: Custom UIButton using xibiOS Swift 3:使用 xib 的自定义 UIButton
【发布时间】:2017-09-12 20:55:23
【问题描述】:

我创建了一个这样的自定义 UIButton:

import UIKit

class HomeButton: UIButton {

    @IBOutlet weak var viewBG: UIView!

    @IBInspectable var fontSize: CGFloat = 22

    @IBInspectable var bgColor: UIColor? = UIColor.white{
        didSet{
            viewBG.backgroundColor = bgColor
        }
    }

    override init(frame: CGRect) {
        super.init(frame: frame)
        setup()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        setup()
    }

    override func layoutSubviews() {
        super.layoutSubviews()
        self.titleLabel?.font = UIFont(name: "Lato-Bold", size: fontSize)
    }


    func setup() {
        let view = loadViewFromNib(nibName: "HomeButton") as! SpringButton
        view.frame = self.bounds
        view.autoresizingMask = [.flexibleWidth, .flexibleHeight]
        addSubview(view)

        self.clipsToBounds = true

        self.titleLabel?.textColor = UIColor.white
        self.setTitleColor(UIColor.white, for: UIControlState.normal)

        self.layer.cornerRadius = CGFloat(K.CORNER_RADIUS)  

        self.backgroundColor = UIColor.clear
    }

}

这是我的 HomeButton 的 xib 文件,我也将它命名为 HomeButton.xib

这是 SpringButton 类

import UIKit

class SpringButton: UIButton {

   open var minimumScale: CGFloat = 0.95
   open var pressSpringDamping: CGFloat = 0.4
   open var releaseSpringDamping: CGFloat = 0.35
   open var pressSpringDuration = 0.4
   open var releaseSpringDuration = 0.5

public init() {
    super.init(frame: CGRect.zero)
}

required public init(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)!
}

override open func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    super.touchesBegan(touches, with: event)
    UIView.animate(withDuration: self.pressSpringDuration, delay: 0, usingSpringWithDamping: self.pressSpringDamping, initialSpringVelocity: 0, options: [.curveLinear, .allowUserInteraction], animations: { () -> Void in
        self.transform = CGAffineTransform(scaleX: self.minimumScale, y: self.minimumScale)
    }, completion: nil)
}

override open func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
    super.touchesEnded(touches, with: event)
    UIView.animate(withDuration: self.releaseSpringDuration, delay: 0, usingSpringWithDamping: self.releaseSpringDamping, initialSpringVelocity: 0, options: [.curveLinear, .allowUserInteraction], animations: { () -> Void in
        self.transform = CGAffineTransform.identity
    }, completion: nil)
}

override open func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
    let location = touches.first!.location(in: self)
    if !self.bounds.contains(location) {
        UIView.animate(withDuration: self.releaseSpringDuration, delay: 0, usingSpringWithDamping: self.releaseSpringDamping, initialSpringVelocity: 0, options: [.curveLinear, .allowUserInteraction], animations: { () -> Void in
            self.transform = CGAffineTransform.identity
        }, completion: nil)
    }
}

override open func touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent?) {
    super.touchesCancelled(touches, with: event)
    UIView.animate(withDuration: self.releaseSpringDuration, delay: 0, usingSpringWithDamping: self.releaseSpringDamping, initialSpringVelocity: 0, options: [.curveLinear, .allowUserInteraction], animations: { () -> Void in
        self.transform = CGAffineTransform.identity
    }, completion: nil)
}

}

在 SpringButton 中,我重写了函数:touchesBegan、touchesEnded、touchesMoved、touchesCancelled,以便在单击时为按钮设置动画,但这些函数从未被调用。为什么?我这样做是正确的还是应该以其他方式进行?

要使用 HomeButton,我只需在情节提要中创建一个 IBOutlet 按钮:

我需要以这种方式创建自定义按钮,因为我稍后会在左侧添加一个图像,在右侧添加另一个图标,因此可以轻松地以我想要的方式自定义按钮。

【问题讨论】:

  • 启用与该视图或按钮的用户交互,并使您的 xib 文件与您的类相同..您用作 SpringButton..
  • 哦,我明白了,但是当我在 Spring Button 中启用用户交互时,我无法在我的控制器中接收 @IBAction 事件
  • 同时添加 springButton 类
  • 我不明白?
  • 您创建了一个新的按钮类,称为“主页按钮”,但是“弹簧按钮”的类在哪里?请同时发布 Spring 按钮的代码。

标签: ios swift xcode uibutton custom-controls


【解决方案1】:

目前,您自定义按钮的类是 HomeButton,因此它不会响应您在 SpringButton 中覆盖的函数。

正如@karthikeyan 所说,您需要在检查器中将自定义按钮的类更改为SpringButton

【讨论】:

  • 哦,我明白了。我应该将 HomeButton 类更改为扩展 UIView 而不是 UIButton?
猜你喜欢
  • 2017-04-15
  • 2012-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多