¿Cómo hacer un botón redondeado simple en Storyboard?

104

Acabo de comenzar a aprender el desarrollo de iOS, no puedo encontrar cómo hacer un botón redondeado simple. Encuentro recursos para versiones antiguas. ¿Necesito establecer un fondo personalizado para un botón? En Android, solo usaría un parche 9, pero sé que iOS no tiene esta capacidad.

ingrese la descripción de la imagen aquí

Gintas_
fuente

Respuestas:

82

Para hacerlo en el guión gráfico, debe usar una imagen para el botón.

Alternativamente, puede hacerlo en código:

 btn.layer.cornerRadius = 10
 btn.clipsToBounds = true
realtimez
fuente
2
¿Por qué se necesita clipsToBounds? Parece que esa sombra no funciona hasta que la elimino.
Gintas_
1
Buena respuesta, pero puedes hacerlo en IB, sin imágenes. Vea abajo.
zontar
223

Respuesta corta: SI

Absolutamente puede hacer un botón redondeado simple sin la necesidad de una imagen de fondo adicional o escribir ningún código para el mismo. Simplemente siga la captura de pantalla que se muestra a continuación para establecer los atributos de tiempo de ejecución del botón y obtener el resultado deseado.

No se mostrará en el, Storyboardpero funcionará bien cuando ejecute el proyecto.

ingrese la descripción de la imagen aquí

Nota:
La 'Ruta de la clave' layer.cornerRadius y el valor es 5. El valor debe cambiarse de acuerdo con la altura y el ancho del botón. La fórmula es la altura del botón * 0.50. Así que juegue con el valor para ver el botón redondeado esperado en el simulador o en el dispositivo físico. Este procedimiento se verá tedioso cuando tenga más de un botón para redondear en el guión gráfico.

Nishant
fuente
9
Por favor agregue un comentario cuando vote en negativo.
Nishant
7
Es decepcionante que IB no pueda mostrar esto como una aplicación de dibujo corriente.
William Cerniuk
2
@WilliamCerniuk: De hecho, puede. Visite nshipster.com/ibinspectable-ibdesignable
Nishant
La configuración de los atributos de tiempo de ejecución definidos por el usuario sí funciona, visible en el simulador después de la construcción.
Cons Bulaquena
Como dice la respuesta aceptada, es posible que también deba agregar una ruta de clave booleana clipsToBoundspara que esto funcione.
Máximo
86

Puedes hacer algo como esto:

@IBDesignable class MyButton: UIButton
{
    override func layoutSubviews() {
        super.layoutSubviews()

        updateCornerRadius()
    }

    @IBInspectable var rounded: Bool = false {
        didSet {
            updateCornerRadius()
        }
    }

    func updateCornerRadius() {
        layer.cornerRadius = rounded ? frame.size.height / 2 : 0
    }
}

Establezca la clase MyButtonen Identity Inspectory en IB tendrá la roundedpropiedad:

ingrese la descripción de la imagen aquí

ChikabuZ
fuente
4
De lejos, la mejor respuesta. ¡Aprendí algo nuevo hoy increíble!
Marcos
2
Esta respuesta no está completa. Cuando inicie su aplicación, xCode utilizará el tamaño del marco de la vista en el generador de interfaces, no el tamaño real del marco cuando la aplicación se esté ejecutando.
Simon Backx
2
También puede utilizar "didSet" en lugar de "willSet" y eliminar el argumento isRounded.
Simon Backx
1
Si usa una imagen de fondo, configure layer.masksToBounds = truetambién
zontar
34
  1. Crea una clase de Cocoa Touch.

ingrese la descripción de la imagen aquí

  1. Inserte el código en la clase RoundButton.

    import UIKit
    
    @IBDesignable
    class RoundButton: UIButton {
    
        @IBInspectable var cornerRadius: CGFloat = 0{
            didSet{
            self.layer.cornerRadius = cornerRadius
            }
        }
    
        @IBInspectable var borderWidth: CGFloat = 0{
            didSet{
                self.layer.borderWidth = borderWidth
            }
        }
    
        @IBInspectable var borderColor: UIColor = UIColor.clear{
            didSet{
                self.layer.borderColor = borderColor.cgColor
            }
        }
    }
  2. Consulte la imagen.

ingrese la descripción de la imagen aquí

anson
fuente
Deje de publicar la misma respuesta repetidamente. Esto se considera ruido. Adapte sus respuestas a las diferentes preguntas o, si son realmente la misma pregunta, puede marcarlas como duplicadas (y cuando tenga suficiente reputación, vote para cerrar).
elixenide
No sé si otros se encontraron con esto también, pero tan pronto como configuro la clase en un botón y le doy un radio, ancho de borde y color de borde, Xcode (9.2) arroja un error de que hubo un error de representación. La creación de la aplicación tiene éxito, pero el rojo "!" sigue mostrándose. Solo digo ... Cambié de nuevo a la solución de solo código (aunque esta fue realmente una forma elegante).
Aeger
10

Encontré que la forma más fácil de hacer esto es configurando cornerRadius a la mitad de la altura de la vista.

button.layer.cornerRadius = button.bounds.size.height/2
FrankkieNL
fuente
No, no lo hice. Si su altura y ancho son iguales (entonces habría sido cuadrado), entonces obtendría un círculo. Pero si el ancho es mayor que el alto, el botón será correcto.
FrankkieNL
2
Tienes razón, me perdí la imagen incluida en la pregunta que muestra lo que realmente era el póster después de que coincida más con tu respuesta que con la respuesta aceptada - voto a favor
Michael Hudson
4

Puede conectar su IBOutletbotón desde el guión gráfico.

Entonces puedes configurar corner radius su botón para hacer su esquina.

por ejemplo, tu outletes myButtonentonces,

Obj - C

 self.myButton.layer.cornerRadius = 5.0 ;

Rápido

  myButton.layer.cornerRadius = 5.0

Si quieres botón exacta redonda a continuación, el botón es widthy heightdebe ser equaly cornerRadiusdebe ser igual a la altura o anchura / 2 (la mitad de la anchura o altura).

Ketan Parmar
fuente
4

Como otra respuesta ha sugerido para realizar la mayor parte de este trabajo en código, solo una respuesta proporcionó una forma de ver sus cambios en la interfaz IB del guión gráfico. Mi respuesta va más allá de esa respuesta al permitirle cambiar el radio de esquina de la vista, botón, imagen, etc.

Por favor, eche un vistazo al siguiente código. Para usar este código, cree un nuevo archivo rápido llamado RoundedView o como quiera llamarlo, luego vaya a su guión gráfico y cambie la clase a "RoundedView", "RoundedImageView" o "RoundedButton".

import UIKit

@IBDesignable class RoundedImage: UIImageView
{
    override func layoutSubviews() {
        super.layoutSubviews()

        updateCornerRadius()
    }

    @IBInspectable var rounded: Bool = false {
        didSet {
            updateCornerRadius()
        }
    }

    @IBInspectable var cornerRadius: CGFloat = 0.1 {
        didSet {
            updateCornerRadius()
        }
    }

    func updateCornerRadius() {
        layer.cornerRadius = rounded ? cornerRadius : 0
        layer.masksToBounds = rounded ? true : false
    }
}

@IBDesignable class RoundedView: UIView
{
    override func layoutSubviews() {
        super.layoutSubviews()

        updateCornerRadius()
    }

    @IBInspectable var rounded: Bool = false {
        didSet {
            updateCornerRadius()
        }
    }

    @IBInspectable var cornerRadius: CGFloat = 0.1 {
        didSet {
            updateCornerRadius()
        }
    }

    func updateCornerRadius() {
        layer.cornerRadius = rounded ? cornerRadius : 0
        layer.masksToBounds = rounded ? true : false
    }
}

@IBDesignable class RoundedButton: UIButton
{
    override func layoutSubviews() {
        super.layoutSubviews()

        updateCornerRadius()
    }

    @IBInspectable var rounded: Bool = false {
        didSet {
            updateCornerRadius()
        }
    }

    @IBInspectable var cornerRadius: CGFloat = 0.1 {
        didSet {
            updateCornerRadius()
        }
    }

    func updateCornerRadius() {
        layer.cornerRadius = rounded ? cornerRadius : 0
        layer.masksToBounds = rounded ? true : false
    }
}
Joseph Shenton
fuente
1

Al agregar layer.cornerRadiusel guión gráfico, asegúrese de no tener espacios iniciales o finales. Si copia y pega, es posible que se inserten espacios. Sería bueno si XCode dijera algún tipo de advertencia o error.

venki mohan
fuente
0

¡¡Prueba esto!!

 override func viewDidLoad() {
   super.viewDidLoad()

   var button = UIButton.buttonWithType(.Custom) as UIButton
   button.frame = CGRectMake(160, 100, 200,40)

   button.layer.cornerRadius =5.0
   button.layer.borderColor = UIColor.redColor().CGColor
   button.layer.borderWidth = 2.0

   button.setImage(UIImage(named:"Placeholder.png"), forState: .Normal)
   button.addTarget(self, action: "OnClickroundButton", forControlEvents: .TouchUpInside)
   button.clipsToBounds = true

   view.addSubview(button)
}
    func OnClickroundButton() {
   NSLog(@"roundButton Method Called");
}
Sanjeet verma
fuente
0

La extensión es la mejor opción para este problema. Crear una extensión de Vista o Botón

public extension UIView {
  //Round the corners
  func roundCorners(){
    let radius = bounds.maxX / 16
    layer.cornerRadius = radius
  }
}

Llámalo desde el código

button.roundCorners()
muhammad usman
fuente
0

Estoy usando Xcode versión 11.4

En el inspector de atributos, puede definir el radio de la esquina.

No se mostrará en el Storyboard, pero funcionará bien cuando ejecute el proyecto.

ingrese la descripción de la imagen aquí

casillas
fuente
-1
import UIKit

@IBDesignable class MyButton: UIButton
{
    override func layoutSubviews() {
        super.layoutSubviews()


    }

    func updateCornerRadius(radius:CGFloat) {
        layer.cornerRadius = radius
    }
    @IBInspectable var cornerRadius:CGFloat = 0{
        didSet{
            updateCornerRadius(radius: cornerRadius)
        }
    }
}
Rodrigo Salomao
fuente