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
iOS Swift 3: Custom UIButton using xib
提问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
这是我的 HomeButton 的 xib 文件,我也将它命名为 HomeButton.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:
要使用 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 HomeButton
so it does not response functions you override in SpringButton
.
现在您的自定义按钮的类是HomeButton
这样的,它不会响应您在SpringButton
.
As @karthikeyan say you need change your customized button's class to SpringButton
in inspector.
正如@karthikeyan 所说,您需要将自定义按钮的类更改SpringButton
为检查器中。