Skip to content

Instantly share code, notes, and snippets.

@srstanic
Last active March 30, 2017 21:02
Show Gist options
  • Save srstanic/9637ef9a57d34546a9d7056082e8d45e to your computer and use it in GitHub Desktop.
Save srstanic/9637ef9a57d34546a9d7056082e8d45e to your computer and use it in GitHub Desktop.
RoundedBorderButton.swift
import UIKit
@IBDesignable
class RoundedBorderButton: UIButton {
@IBInspectable dynamic var cornerRadius: CGFloat = 20.0 {
didSet {
layer.cornerRadius = cornerRadius
layer.masksToBounds = true
}
}
@IBInspectable dynamic var borderWidth: CGFloat = 1.0 {
didSet {
layer.borderWidth = borderWidth
}
}
@IBInspectable dynamic var verticalInset: CGFloat = 10.0 {
didSet {
contentEdgeInsets.top = verticalInset
contentEdgeInsets.bottom = verticalInset
}
}
@IBInspectable dynamic var horizontalInset: CGFloat = 20.0 {
didSet {
contentEdgeInsets.left = horizontalInset
contentEdgeInsets.right = horizontalInset
}
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
_init()
}
override init(frame: CGRect) {
super.init(frame: frame)
_init()
}
func _init() {
clipsToBounds = true
layer.borderColor = titleColor(for: .normal)?.cgColor
setTitleColor(titleColor(for: .normal)?.withAlphaComponent(highlightedAlpha), for: .highlighted)
// repeat all didSets so that defaults are applied
layer.cornerRadius = cornerRadius
layer.borderWidth = borderWidth
contentEdgeInsets.top = verticalInset
contentEdgeInsets.bottom = verticalInset
contentEdgeInsets.left = horizontalInset
contentEdgeInsets.right = horizontalInset
}
private var normalAlpha: CGFloat = 1
private var highlightedAlpha: CGFloat = 0.2
private var borderColorAlpha: CGFloat? {
get {
return layer.borderColor?.alpha
}
set {
if let borderColor = layer.borderColor,
let newAlpha = newValue {
layer.borderColor = UIColor(cgColor: borderColor).withAlphaComponent(CGFloat(newAlpha)).cgColor
}
}
}
override func layoutSubviews() {
super.layoutSubviews()
if borderWidth > 0 {
if state == .highlighted && borderColorAlpha != highlightedAlpha {
borderColorAlpha = highlightedAlpha
layoutIfNeeded()
} else if state == .normal && borderColorAlpha != normalAlpha {
borderColorAlpha = normalAlpha
layoutIfNeeded()
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment