En Objective-C telle ligne
self.mainImageView.layer.cornerRadius = CGRectGetWidth(self.mainImageView.frame)/4.0f;
fait son travail, je l'ai essayé dans Swift en utilisant l'analogie
self.mainImageView.layer.cornerRadius = CGRectGetWidth(self.mainImageView.frame)/4.0
et ça ne change rien, les angles sont les mêmes qu'auparavant. De plus, Xcode ne montre aucune erreur de syntaxe. Est-ce que Swift prend en charge un autre moyen d'atteindre cet objectif? J'ai vérifié d'autres discussions ici et cela se fait généralement en Swift de la manière indiquée ci-dessus.
La couche dessine en dehors de la région du clip, vous devez la définir comme masque aux limites:
self.mainImageView.layer.masksToBounds = true
De la docs :
Par défaut, le rayon d’angle ne s’applique pas à l’image dans la propriété de contenu du calque; il ne s'applique qu'à la couleur d'arrière-plan et à la bordure du calque. Cependant, si vous définissez la propriété masksToBounds sur true, le contenu est tronqué aux coins arrondis.
Il y a une petite différence entre Swift 3. et Xcode8
Chaque fois que vous souhaitez appliquer un rayon de coin à UIView, assurez-vous d'appeler yourUIView.layoutIfNeeded()
avant d'appeler cornerRadius
.
Sinon, il retournera la valeur par défaut pour la hauteur et la largeur d'UIView (1000.0), ce qui fera probablement disparaître votre vue.
Assurez-vous toujours que tous les effets modifiant la taille de UIView (contraintes de constructeur d'interface, etc.) sont appliqués avant de définir les propriétés des calques.
Exemple d'implémentation de classe UIView
class BadgeView: UIView {
override func awakeFromNib() {
self.layoutIfNeeded()
layer.cornerRadius = self.frame.height / 2.0
layer.masksToBounds = true
}
}
Vous pouvez définir le rayon de la bordure de toute vue en fournissant un "Attributs d'exécution définis par l'utilisateur", en fournissant le chemin d'accès à la clé "layer.cornerRadius" de type chaîne, puis en indiquant la valeur du rayon dont vous avez besoin;) Voir les images jointes ci-dessous:
essaye ça
self.mainImageView.layer.cornerRadius = CGRectGetWidth(self.mainImageView.frame)/4.0
self.mainImageView.clipsToBounds = true
in Swift 3 'CGRectGetWidth' a été remplacé par la propriété 'CGRect.width'
view.layer.cornerRadius = view.frame.width/4.0
view.clipsToBounds = true
Marqué avec @IBInspectable
in Swift (ou IBInspectable dans Objective-C), ils sont facilement modifiables dans le panneau Inspecteur des attributs d’Interface Builder.
Vous pouvez directement définir borderWidth , cornerRadius , borderColor dans l'inspecteur d'attributs
extension UIView {
@IBInspectable var cornerRadius: CGFloat {
get{
return layer.cornerRadius
}
set {
layer.cornerRadius = newValue
layer.masksToBounds = newValue > 0
}
}
@IBInspectable var borderWidth: CGFloat {
get {
return layer.borderWidth
}
set {
layer.borderWidth = newValue
}
}
@IBInspectable var borderColor: UIColor? {
get {
return UIColor(cgColor: layer.borderColor!)
}
set {
layer.borderColor = borderColor?.cgColor
}
}
}
Swift 3, Xcode 8, iOS 10
DispatchQueue.main.async {
self.mainImageView.layer.cornerRadius = self.mainImageView.bounds.size.width / 2.0
self.mainImageView.clipsToBounds = true
}
J'ai créé une extension UIView
qui permet d'arrondir des angles spécifiques:
import UIKit
enum RoundType {
case top
case none
case bottom
case both
}
extension UIView {
func round(with type: RoundType, radius: CGFloat = 3.0) {
var corners: UIRectCorner
switch type {
case .top:
corners = [.topLeft, .topRight]
case .none:
corners = []
case .bottom:
corners = [.bottomLeft, .bottomRight]
case .both:
corners = [.allCorners]
}
DispatchQueue.main.async {
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
}
}
}
Le moyen le plus simple est de créer une sous-classe UIImageView (je l’ai essayée et elle fonctionne parfaitement sur iPhone 7 et XCode 8):
class CIRoundedImageView: UIImageView {
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
override func awakeFromNib() {
self.layoutIfNeeded()
layer.cornerRadius = self.frame.height / 2.0
layer.masksToBounds = true
}
}
et puis vous pouvez également définir une bordure:
imageView.layer.borderWidth = 2.0
imageView.layer.borderColor = UIColor.blackColor().CGColor