Alrededor de las esquinas superiores de un UIButton en Swift

Sé que puedo redondear las cuatro esquinas usando:

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

Como solo quiero redondear dos, hice una investigación y encontré esto :

 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 ser de tipo UIButton y le paso un botón, la salida se ve así:

enter image description here

La pregunta es, ¿cómo lo adapto para trabajar en un UIButton?

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 en viewDidAppear / viewDidLayoutSubviews:

 btnCorner.roundedButton() 

Botón de salida de esquina:

enter image description here

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 la extensión, no olvide agregar:

 import UIKit 

Si desea una extensión para una 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 por un botón como:

 myButton.roundedCorners(top: true) 

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 } 

Actualiza tu 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 saber el marco

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

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

Olvidaste establecer el marco de tu capa de forma:

 mask.frame = layer.bounds 

Usa 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

Intereting Posts