UIButton
subclass in Swift
*The following code works in Swift 3 and above.
You cannot set the buttonType
of a UIButton
subclass by design. It is automatically set to custom
which means you get a plain appearance and behavior as a starting point.
If you want to reuse code that sets the button's appearance, you can do this without subclassing. One approach is by providing factory methods that create a UIButton
and set visual properties.
Example factory method to avoid subclassing
extension UIButton {
static func createStandardButton() -> UIButton {
let button = UIButton(type: UIButtonType.system)
button.titleLabel?.font = UIFont.boldSystemFont(ofSize: 16)
button.setTitleColor(UIColor.black, for: .normal)
button.setTitleColor(UIColor.gray, for: .highlighted)
return button
}
}
let button = UIButton.createStandardButton()
I avoid subclassing UIButton
when other customization techniques suffice. The factory method example is one option. There are other options including the UIAppearance API, etc.
Sometimes there are customization needs that require subclassing. For example, I've created UIButton
subclasses to take fine control over how the button animates in response to touch events or to have the button call a predefined delegate or closure when tapped (as opposed to assigning a #selector
to each instance).
The following is a basic UIButton
subclass example as a starting point.
Example UIButton Subclass
internal class CustomButton: UIButton {
init() {
// The frame can be set outside of the initializer. Default to zero.
super.init(frame: CGRect.zero)
initialize()
}
required init?(coder aDecoder: NSCoder) {
// Called when instantiating from storyboard or nib
super.init(coder: aDecoder)
initialize()
}
func initialize() {
print("Execute common initialization code")
}
}
let button = CustomButton()
print(button.buttonType == .custom) // true
A note about UIButtonType
Since the question was asked in 2012, UIButtonType.roundedRect
has been deprecated. The header file comments say to use UIButtonType.system
instead.
The following is from UIButton.h converted to Swift in Xcode
public enum UIButtonType : Int {
case custom // no button type
@available(iOS 7.0, *)
case system // standard system button
case detailDisclosure
case infoLight
case infoDark
case contactAdd
public static var roundedRect: UIButtonType { get } // Deprecated, use UIButtonTypeSystem instead
}