Je sais que je peux contourner les quatre coins en utilisant:
myBtn.layer.cornerRadius = 8
myBtn.layer.masksToBounds = true
Comme je ne veux que deux tours, j’ai fait des recherches et trouvé 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
}
}
Qui s'appelle comme ceci:
view.roundCorners([.TopLeft , .TopRight], radius: 10)
Pourtant, cela ne fonctionne pas pour un UIButton. Quand je change l'extension pour être de type UIButton et passe un bouton, la sortie ressemble à ceci:
La question est, comment puis-je adapter cela pour travailler sur un UIButton?
Ajout d'une extension 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
}
}
Appel dans viewDidAppear/viewDidLayoutSubviews:
btnCorner.roundedButton()
Button Corner OutPut:
Pour Swift 3 La réponse de Kirit Modi est modifiée en:
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
}
}
Au début du fichier d'extension, n'oubliez pas d'ajouter:
import UIKit
Si vous voulez une extension pour un UIView avec l’option d’arrondir les coins supérieurs ou inférieurs, vous pouvez utiliser:
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
}
}
Qui s'appelle pour un bouton comme:
myButton.roundedCorners(top: true)
Swift 4: à partir de la dernière iOS 11
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
}
}
Versions antérieures pour iOS (10,9, etc.) (fonctionne également pour 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
}
iOS 11 a vraiment facilité les arrondis. Le code ci-dessous arrondit les coins supérieur gauche et inférieur droit.
myView.layer.maskedCorners = [.layerMinXMinYCorner, .layerMaxXMaxYCorner]
Mettez à jour votre extension pour ressembler à ceci:
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
}
}
Le calque de forme (masque) doit connaître le cadre
Vous avez oublié de définir le cadre de votre calque de forme:
mask.frame = layer.bounds
Utilisez ce code,
let path = UIBezierPath(roundedRect:viewTo.bounds, byRoundingCorners:[.TopRight, .TopLeft], cornerRadii: CGSizeMake(20, 20))
let maskLayer = CAShapeLayer()
maskLayer.path = path.CGPath
viewTo.layer.mask = maskLayer
j'espère que c'est utile