ios swift uibutton rounded-corners

ios - Esquinas redondeadas de un botón UIB en Swift



uibutton rounded-corners (9)

Actualice su extensión para que sea así:

extension UIView { func roundCorners(corners:UIRectCorner, radius: CGFloat) { let path = UIBezierPath(roundedRect: self.bounds, byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius)) let mask = CAShapeLayer() let rect = self.bounds mask.frame = rect mask.path = path.cgPath self.layer.mask = mask } }

La capa de forma (máscara) necesita conocer el marco

Sé que puedo redondear las cuatro esquinas usando:

myBtn.layer.cornerRadius = 8 myBtn.layer.masksToBounds = true

Como solo quiero la segunda ronda, investigué un poco y encontré this :

extension UIView { func roundCorners(corners:UIRectCorner, radius: CGFloat) { let path = UIBezierPath(roundedRect: self.bounds, byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius)) let mask = CAShapeLayer() mask.path = path.CGPath self.layer.mask = mask } }

Que se llama así:

view.roundCorners([.TopLeft , .TopRight], radius: 10)

Sin embargo, esto no funciona para un UIButton. Cuando cambio la extensión para que sea del tipo UIButton y le pase un botón, la salida se ve así:

La pregunta es, ¿cómo puedo adaptar esto para trabajar en un UIButton?


Olvidó configurar el marco de su capa de forma:

mask.frame = layer.bounds


Para Swift 3, la respuesta de Kirit Modi se cambia a:

extension UIButton { func roundedButton(){ let maskPAth1 = UIBezierPath(roundedRect: self.bounds, byRoundingCorners: [.topLeft , .topRight], cornerRadii:CGSize(width:8.0, height:8.0)) let maskLayer1 = CAShapeLayer() maskLayer1.frame = self.bounds maskLayer1.path = maskPAth1.cgPath self.layer.mask = maskLayer1 } }

Al comienzo del archivo de extensión, no olvide agregar:

import UIKit

Si desea una extensión para un UIView con la opción de redondear las esquinas superiores o inferiores, puede usar:

extension UIView { func roundedCorners(top: Bool){ let corners:UIRectCorner = (top ? [.topLeft , .topRight] : [.bottomRight , .bottomLeft]) let maskPAth1 = UIBezierPath(roundedRect: self.bounds, byRoundingCorners: corners, cornerRadii:CGSize(width:8.0, height:8.0)) let maskLayer1 = CAShapeLayer() maskLayer1.frame = self.bounds maskLayer1.path = maskPAth1.cgPath self.layer.mask = maskLayer1 } }

Que se llama para un botón como:

myButton.roundedCorners(top: true)


Para Swift 5 y la mayor flexibilidad

Definir una extensión con una función roundCorners

extension UIButton { func roundCorners(corners: UIRectCorner, radius: Int = 8) { let maskPath1 = UIBezierPath(roundedRect: bounds, byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius)) let maskLayer1 = CAShapeLayer() maskLayer1.frame = bounds maskLayer1.path = maskPath1.cgPath layer.mask = maskLayer1 } }

Llama a la función roundCorners

myButton.roundCorners(corners: [.topLeft, .topRight])

O con un radio específico

myButton.roundCorners(corners: [.topLeft, .topRight], radius: 20)


Use este código,

let path = UIBezierPath(roundedRect:viewTo.bounds, byRoundingCorners:[.TopRight, .TopLeft], cornerRadii: CGSizeMake(20, 20)) let maskLayer = CAShapeLayer() maskLayer.path = path.CGPath viewTo.layer.mask = maskLayer

espero que sea útil


el redondeo se aplica a la esquina de la vista / Botón .., pero al llegar al borde del botón, no se aplica correctamente. ¿Puedo tener alguna solución para eso? @ @

Aquí está el código que he usado, que funciona (borde) en iOS11.0 y superior y no en las versiones siguientes (<11.0)

if #available(iOS 11.0, *) { self.layer.cornerRadius = radius self.layer.maskedCorners = maskedCorners } else { let shapeLayer = CAShapeLayer() shapeLayer.position = self.center self.layer.masksToBounds = true self.clipsToBounds = true let bezirePath = UIBezierPath(roundedRect: self.bounds, byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius)) shapeLayer.bounds = frame shapeLayer.path = bezirePath.cgPath self.layer.mask = shapeLayer


iOS 11 ha hecho que sea realmente fácil redondear esquinas. El siguiente código redondea las esquinas superior izquierda e inferior derecha.

myView.layer.maskedCorners = [.layerMinXMinYCorner, .layerMaxXMaxYCorner]


Agregar extensión de UIButton:

extension UIButton{ func roundedButton(){ let maskPath1 = UIBezierPath(roundedRect: bounds, byRoundingCorners: [.topLeft , .topRight], cornerRadii: CGSize(width: 8, height: 8)) let maskLayer1 = CAShapeLayer() maskLayer1.frame = bounds maskLayer1.path = maskPath1.cgPath layer.mask = maskLayer1 } }

Llamando a viewDidAppear / viewDidLayoutSubviews:

btnCorner.roundedButton()

Botón de esquina de salida


Swift 4: para el último iOS 11 en adelante

override func viewDidLoad() { super.viewDidLoad() if #available(iOS 11.0, *) { self.viewToRound.clipsToBounds = true viewToRound.layer.cornerRadius = 20 viewToRound.layer.maskedCorners = [.layerMinXMinYCorner, .layerMaxXMinYCorner] } else { // Fallback on earlier versions } }

Versiones anteriores de iOS (10,9, etc.) (también funciona para iOS 11)

override func viewDidLayoutSubviews() { self.viewToRound.clipsToBounds = true let path = UIBezierPath(roundedRect: viewToRound.bounds, byRoundingCorners: [.topRight, .topLeft], cornerRadii: CGSize(width: 20, height: 20)) let maskLayer = CAShapeLayer() maskLayer.path = path.cgPath viewToRound.layer.mask = maskLayer }