Solución:
Usar button.layer.cornerRadius
, button.layer.borderColor
y button.layer.borderWidth
. Tenga en cuenta que borderColor
requiere un CGColor
, por lo que podría decir (Swift 3/4):
button.backgroundColor = .clear
button.layer.cornerRadius = 5
button.layer.borderWidth = 1
button.layer.borderColor = UIColor.black.cgColor
Para hacer este trabajo en el guión gráfico (Interface Builder Inspector)
Con la ayuda de IBDesignable
, podemos agregar más opciones a Interface Builder Inspector para UIButton
y modificarlos en el guión gráfico. Primero, agregue el siguiente código a su proyecto.
@IBDesignable extension UIButton {
@IBInspectable var borderWidth: CGFloat {
set {
layer.borderWidth = newValue
}
get {
return layer.borderWidth
}
}
@IBInspectable var cornerRadius: CGFloat {
set {
layer.cornerRadius = newValue
}
get {
return layer.cornerRadius
}
}
@IBInspectable var borderColor: UIColor? {
set {
guard let uiColor = newValue else { return }
layer.borderColor = uiColor.cgColor
}
get {
guard let color = layer.borderColor else { return nil }
return UIColor(cgColor: color)
}
}
}
Luego, simplemente configure los atributos de los botones en el guión gráfico.
He creado una subcacasa de UIButton simple que usa el tintColor
por su texto y colores de borde y cuando se resalta cambia su fondo a la tintColor
.
class BorderedButton: UIButton {
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
layer.borderWidth = 1.0
layer.borderColor = tintColor.CGColor
layer.cornerRadius = 5.0
clipsToBounds = true
contentEdgeInsets = UIEdgeInsets(top: 8, left: 8, bottom: 8, right: 8)
setTitleColor(tintColor, forState: .Normal)
setTitleColor(UIColor.whiteColor(), forState: .Highlighted)
setBackgroundImage(UIImage(color: tintColor), forState: .Highlighted)
}
}
Esto hace uso de una extensión UIImage que crea una imagen a partir de un color, encontré ese código aquí: https://stackoverflow.com/a/33675160
Funciona mejor cuando se configura para escribir Personalizado en el generador de interfaces, ya que el tipo de sistema predeterminado modifica ligeramente los colores cuando el botón está resaltado.