versiones tutorial plataforma objective example entre diferencias compiler ios objective-c

ios - tutorial - ¿Cómo crear borde en UIButton?



objective c vs swift (11)

Uso un botón personalizado en mi aplicación llamado "addButton" y quiero delimitarlo con un color blanco. ¿Cómo puedo obtener el borde de color blanco alrededor de mi botón personalizado?


**** En Swift 3 ****

Para crear borde

btnName.layer.borderWidth = 1 btnName.layer.borderColor = UIColor.black.cgColor

Para hacer esquina redondeada

btnName.layer.cornerRadius = 5


Actualización con Swift 3

button.layer.borderWidth = 0.8 button.layer.borderColor = UIColor.blue.cgColor


Aquí hay una subclase UIButton que admite la animación de estado resaltada sin usar imágenes. También actualiza el color del borde cuando cambia el modo de tinte de la vista.

class BorderedButton: UIButton { override init(frame: CGRect) { super.init(frame: frame) layer.borderColor = tintColor.CGColor layer.borderWidth = 1 layer.cornerRadius = 5 contentEdgeInsets = UIEdgeInsets(top: 5, left: 10, bottom: 5, right: 10) } required init?(coder aDecoder: NSCoder) { fatalError("NSCoding not supported") } override func tintColorDidChange() { super.tintColorDidChange() layer.borderColor = tintColor.CGColor } override var highlighted: Bool { didSet { let fadedColor = tintColor.colorWithAlphaComponent(0.2).CGColor if highlighted { layer.borderColor = fadedColor } else { layer.borderColor = tintColor.CGColor let animation = CABasicAnimation(keyPath: "borderColor") animation.fromValue = fadedColor animation.toValue = tintColor.CGColor animation.duration = 0.4 layer.addAnimation(animation, forKey: "") } } } }

Uso:

let button = BorderedButton(style: .System) //style .System is important

Apariencia:


Aquí hay una versión actualizada ( Swift 3.0.1 ) de la answer de Ben Packard.

import UIKit @IBDesignable class BorderedButton: UIButton { @IBInspectable var borderColor: UIColor? { didSet { if let bColor = borderColor { self.layer.borderColor = bColor.cgColor } } } @IBInspectable var borderWidth: CGFloat = 0 { didSet { self.layer.borderWidth = borderWidth } } override var isHighlighted: Bool { didSet { guard let currentBorderColor = borderColor else { return } let fadedColor = currentBorderColor.withAlphaComponent(0.2).cgColor if isHighlighted { layer.borderColor = fadedColor } else { self.layer.borderColor = currentBorderColor.cgColor let animation = CABasicAnimation(keyPath: "borderColor") animation.fromValue = fadedColor animation.toValue = currentBorderColor.cgColor animation.duration = 0.4 self.layer.add(animation, forKey: "") } } } }

El botón resultante se puede usar dentro de StoryBoard gracias a las etiquetas @IBDesignable y @IBInspectable .

También las dos propiedades definidas le permiten establecer el ancho y el color del borde directamente en el constructor de la interfaz y obtener una vista previa del resultado.

Se podrían agregar otras propiedades de manera similar, para el radio del borde y resaltar el tiempo de desvanecimiento.


El problema al establecer borderWidth y borderColor es que cuando toca el botón, el borde no anima el efecto de resaltado.

Por supuesto, puede observar los eventos del botón y cambiar el color del borde en consecuencia, pero eso parece innecesario.

Otra opción es crear un UIImage estirable y configurarlo como imagen de fondo del botón. Puedes crear un conjunto de imágenes en tus Images.xcassets como este:

Luego, configúralo como la imagen de fondo del botón:

Si su imagen es una imagen de plantilla, puede establecer el color del tinte y el borde cambiará:

Ahora el borde se resaltará con el resto del botón cuando se toque.


Es muy simple, simplemente agrega el encabezado quartzCore en tu archivo (para eso tienes que agregar el marco de cuarzo a tu proyecto)

y luego haz esto

[[button layer] setCornerRadius:8.0f]; [[button layer] setMasksToBounds:YES]; [[button layer] setBorderWidth:1.0f];

puede cambiar los valores flotantes según sea necesario.

disfrutar.

Aquí hay un código moderno típico ...

self.buttonTag.layer.borderWidth = 1.0f; self.buttonCancel.layer.borderWidth = 1.0f; self.buttonTag.layer.borderColor = [UIColor blueColor].CGColor; self.buttonCancel.layer.borderColor = [UIColor blueColor].CGColor; self.buttonTag.layer.cornerRadius = 4.0f; self.buttonCancel.layer.cornerRadius = 4.0f;

ese es un aspecto similar a los controles segmentados.


No es necesario importar QuartzCore.h ahora. Tomando iOS 8 sdk y Xcode 6.1 en referencia.

Uso directo:

[[myButton layer] setBorderWidth:2.0f]; [[myButton layer] setBorderColor:[UIColor greenColor].CGColor];


Para cambiar el botón Radio, Color y Ancho, configuro de esta manera:

self.myBtn.layer.cornerRadius = 10; self.myBtn.layer.borderWidth = 1; self.myBtn.layer.borderColor =[UIColor colorWithRed:189.0/255.0f green:189.0/255.0f blue:189.0/255.0f alpha:1.0].CGColor;


Puede establecer las propiedades de borde en el CALayer accediendo a la propiedad de capa del botón.

Primero, agrega Cuarzo

#import <QuartzCore/QuartzCore.h>

Establecer propiedades:

myButton.layer.borderWidth = 2.0f; myButton.layer.borderColor = [UIColor greenColor].CGColor;

Ver:

https://developer.apple.com/documentation/quartzcore/calayer#//apple_ref/occ/cl/CALayer

El CALayer en el enlace de arriba le permite establecer otras propiedades como el radio de la esquina, maskToBounds, etc ...

Además, un buen artículo sobre la diversión de los botones:

https://web.archive.org/web/20161221132308/http://www.apptite.be/tutorial_custom_uibuttons.php


Y en poco tiempo, no necesita importar "QuartzCore / QuartzCore.h"

Solo usa:

button.layer.borderWidth = 0.8 button.layer.borderColor = (UIColor( red: 0.5, green: 0.5, blue:0, alpha: 1.0 )).cgColor

o

button.layer.borderWidth = 0.8 button.layer.borderColor = UIColor.grayColor().cgColor


Esto se puede lograr en varios métodos en Swift 3.0. Trabajó en la última versión agosto - 2017

Opción 1:

Asigne directamente los valores de propiedad borderWidth para el botón de IU:

btnUserButtonName.layer.borderWidth = 1.0

Establecer el título con los valores de color predeterminados para el botón de la interfaz de usuario:

btnUserButtonName.setTitleColor(UIColor.darkGray, for: .normal)

Establecer borde con color predeterminado para los valores de propiedad de borde para el botón de IU:

btnUserButtonName.layer.borderColor = UIColor.red

Establecer el color definido por el usuario para los valores de propiedades del borde para el botón de la IU:

let myGrayColor = UIColor(red: 0.889415, green: 0.889436, blue:0.889424, alpha: 1.0 ) btnUserButtonName.layer.borderColor = myGrayColor.cgColor

Opción 2: [Recomendado]

Use el método de extensión, por lo que el botón a través de la aplicación se verá uniforme y no es necesario repetir varias líneas de código en todas partes.

//Create an extension class in any of the swift file extension UIButton { func setBordersSettings() { let c1GreenColor = (UIColor(red: -0.108958, green: 0.714926, blue: 0.758113, alpha: 1.0)) self.layer.borderWidth = 1.0 self.layer.cornerRadius = 5.0 self.layer.borderColor = c1GreenColor.cgColor self.setTitleColor(c1GreenColor, for: .normal) self.layer.masksToBounds = true } }

Uso en el código:

//use the method and call whever the border has to be applied btnUserButtonName.setBordersSettings()

Salida del botón del método de extensión: