¿Cómo puedo crear un UIButton con esquinas redondeadas que sean suaves? Las esquinas redondeadas estándar de Apple son mucho más bonitas que las esquinas redondeadas estándar. Si diseño un botón en el boceto, puedo alternar las "esquinas suaves" que alternan las esquinas de una forma desde las esquinas redondeadas de Apple (suaves) a las esquinas redondeadas estándar.

Aquí hay una comparación:

enter image description here

¿Cómo puedo alternar esto rápidamente?

showContentButton.layer.cornerRadius = 20 redondea las esquinas, sin embargo, no sé realmente si estas esquinas redondeadas son "esquinas lisas" o "esquinas redondeadas estándar". Y no sé cómo alternar esto. ¿Algunas ideas?

14
WalterBeiter 13 sep. 2018 a las 12:09

3 respuestas

La mejor respuesta

A partir de iOS 13.0 , puede usar esta propiedad además de configurar el cornerRadius:

sampleButton.layer.cornerCurve = .continuous

Esto también es fácilmente animable, lo que anteriormente resultó en problemas al usar un UIBezierPath.

Ver más en https://developer.apple.com/documentation/quartzcore/calayer/ 3152596-cornercurve

10
Vincent Friedrich 30 ene. 2020 a las 20:27

Solo usa esta extensión

extension CALayer {

   func roundCorners(radius: CGFloat) {
       let roundPath = UIBezierPath(
           roundedRect: self.bounds,
           cornerRadius: radius)
       let maskLayer = CAShapeLayer()
       maskLayer.path = roundPath.cgPath
       self.mask = maskLayer
   }

}

Y úsalo así

cell.layer.roundCorners(radius: 18)
0
enigrify 1 nov. 2019 a las 23:45

Antes de iOS 13

Para obtener ese efecto, puede usar UIBezierPath

Smooth corners

Editar: Uso en UIView

class MyView: UIView {

    let myButton UIButton = UIButton()

    override func layoutSubviews() {
        super.layoutSubviews()

        // your roundPath code here
    }

}

Editar 2:

Use este enfoque para redondear esquinas específicas:

let roundPath = UIBezierPath(
    roundedRect: bounds,
    byRoundingCorners: [.topLeft, .topRight],
    cornerRadii: CGSize(width: 10, height: 10)
)

Fuente

23
inokey 31 ene. 2020 a las 08:50