swift textview rounded-corners

swift - ¿Cómo configurar cornerRadius solo para la vista de texto de la esquina inferior izquierda, inferior derecha y superior izquierda?



textview rounded-corners (7)

problema resuelto trabajo superior derecho e inferior derecho ahora

Código probado en iOS 9, 10, 11 versiones

extension UIView { func roundCorners(_ corners:UIRectCorner,_ cormerMask:CACornerMask, radius: CGFloat) { if #available(iOS 11.0, *){ self.clipsToBounds = false self.layer.cornerRadius = radius self.layer.maskedCorners = cormerMask }else{ let rectShape = CAShapeLayer() rectShape.bounds = self.frame rectShape.position = self.center rectShape.path = UIBezierPath(roundedRect: self.bounds, byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius)).cgPath self.layer.mask = rectShape } } }

¿Cómo establecer el radio de la esquina solo en la vista de texto de la esquina inferior izquierda, inferior derecha y superior izquierda?

let rectShape = CAShapeLayer() rectShape.backgroundColor = UIColor.redColor().CGColor rectShape.bounds = messages.frame rectShape.position = messages.center rectShape.path = UIBezierPath(roundedRect: messages.bounds, byRoundingCorners: .BottomLeft | .TopRight, cornerRadii: CGSize(width: 20, height: 20)).CGPath messages.layer.addSublayer(rectShape)

este código crea dos rect. No se por que


(Swift 4 / iOS 11) Simplemente diga desde abajo:

yourView.clipsToBounds = true yourView.layer.cornerRadius = 10 yourView.layer.maskedCorners = [.layerMaxXMaxYCorner, .layerMinXMaxYCorner]

para un máximo:

yourView.clipsToBounds = true yourView.layer.cornerRadius = 10 yourView.layer.maskedCorners = [.layerMaxXMinYCorner, .layerMinXMinYCorner]

en tu caso:

yourView.layer.maskedCorners = [.layerMaxXMaxYCorner, .layerMinXMaxYCorner, .layerMinXMinYCorner]

Espero que esto ayude :)


Aquí hay una extensión para iOS 11+

import Foundation import UIKit extension UIView { func roundCorners(_ corners: CACornerMask, radius: CGFloat, borderColor: UIColor, borderWidth: CGFloat) { self.layer.maskedCorners = corners self.layer.cornerRadius = radius self.layer.borderWidth = borderWidth self.layer.borderColor = borderColor.cgColor } }

Uso:-

self.yourView.roundCorners([.layerMaxXMaxYCorner, .layerMaxXMinYCorner], radius: 20.0, borderColor: UIColor.green, borderWidth: 1)


Solo necesitas enmascarar la capa como se muestra a continuación:

Para Swift 3 :

let rectShape = CAShapeLayer() rectShape.bounds = self.myView.frame rectShape.position = self.myView.center rectShape.path = UIBezierPath(roundedRect: self.myView.bounds, byRoundingCorners: [.bottomLeft , .bottomRight , .topLeft], cornerRadii: CGSize(width: 20, height: 20)).cgPath self.myView.layer.backgroundColor = UIColor.green.cgColor //Here I''m masking the textView''s layer with rectShape layer self.myView.layer.mask = rectShape

Versión inferior:

let rectShape = CAShapeLayer() rectShape.bounds = self.myView.frame rectShape.position = self.myView.center rectShape.path = UIBezierPath(roundedRect: self.myView.bounds, byRoundingCorners: .BottomLeft | .BottomRight | .TopLeft, cornerRadii: CGSize(width: 20, height: 20)).CGPath self.myView.layer.backgroundColor = UIColor.greenColor().CGColor //Here I''m masking the textView''s layer with rectShape layer self.myView.layer.mask = rectShape


Una mejor respuesta para iOS 11 y iOS 10 en la esquina inferior sería

if #available(iOS 11.0, *){ view.clipsToBounds = false view.layer.cornerRadius = 10 view.layer.maskedCorners = [.layerMaxXMaxYCorner, .layerMinXMaxYCorner] }else{ let rectShape = CAShapeLayer() rectShape.bounds = view.frame rectShape.position = view.center rectShape.path = UIBezierPath(roundedRect: view.bounds, byRoundingCorners: [.bottomLeft , .bottomRight], cornerRadii: CGSize(width: 20, height: 20)).cgPath view.layer.backgroundColor = UIColor.green.cgColor view.layer.mask = rectShape }

en caso de que esto no haya funcionado en iOS 10 y versiones anteriores, intente ejecutar el código en viewDidLayoutSubviews () de su clase de viewcontroller como este

override func viewDidLayoutSubviews() { if #available(iOS 11.0, *){ }else{ let rectShape = CAShapeLayer() rectShape.bounds = view.frame rectShape.position = view.center rectShape.path = UIBezierPath(roundedRect: view.bounds, byRoundingCorners: [.bottomLeft , .bottomRight], cornerRadii: CGSize(width: 20, height: 20)).cgPath view.layer.backgroundColor = UIColor.green.cgColor view.layer.mask = rectShape }


Swift 4

override func viewDidLoad() { let topRight = UIView(frame: CGRect(x: 120, y: 200, width: 120, height: 120)) topRight.roundedTop() topRight.backgroundColor = .red self.view.center = topRight.center self.view.addSubview(topRight) super.viewDidLoad() }

Salida:

extensión en UIView Swift 4: enlace de referencia


Probado en xcode 8 y swift 3

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 } }

se usa así

YourView.roundCorners([.topLeft, .bottomLeft], radius: 10)