xcode iOS Swift 3:使用 xib 自定义 UIButton

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/43448101/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-15 09:55:25  来源:igfitidea点击:

iOS Swift 3: Custom UIButton using xib

iosswiftxcodeuibuttoncustom-controls

提问by Hoang Trung

I created a custom UIButton like this:

我创建了一个像这样的自定义 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
    }

}

and here's my xib file for HomeButton, I also named it HomeButton.xib xib

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

Here's SpringButton class

这是 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)
}

}

In SpringButton, I override functions: touchesBegan, touchesEnded, touchesMoved, touchesCancelled to animate the button when click, but those functions are never called. Why? Am I doing this correctly or should I do any other way?

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

To use the HomeButton, I just create an IBOutlet button in the storyboard: storyboard

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

I need to create the custom button this way because I'll later add an image on the left and another icon on the right, so it's easy to customize the button the way I want.

我需要以这种方式创建自定义按钮,因为稍后我将在左侧添加一个图像,在右侧添加另一个图标,因此很容易按照我想要的方式自定义按钮。

采纳答案by Akii

For now your customized button's class is HomeButtonso it does not response functions you override in SpringButton.

现在您的自定义按钮的类是HomeButton这样的,它不会响应您在SpringButton.

As @karthikeyan say you need change your customized button's class to SpringButtonin inspector.

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