web-dev-qa-db-fra.com

Comment définir le rayon de coin de imageView?

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.

60
DCDC

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.

148
DarthMike

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

   }
 }
27
DCDC

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:

Configuring in XCode

Result in emulator

14
Marcelo Tadeu

essaye ça

self.mainImageView.layer.cornerRadius = CGRectGetWidth(self.mainImageView.frame)/4.0
self.mainImageView.clipsToBounds = true
14
Anbu.Karthik

in Swift 3 'CGRectGetWidth' a été remplacé par la propriété 'CGRect.width'

    view.layer.cornerRadius = view.frame.width/4.0
    view.clipsToBounds = true
5
Nicolas Desormiere

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

enter image description here

5
Amit Jagesha シ

Swift 3, Xcode 8, iOS 10

DispatchQueue.main.async {
  self.mainImageView.layer.cornerRadius = self.mainImageView.bounds.size.width / 2.0
  self.mainImageView.clipsToBounds = true
}
5
Gaurav Rami

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

}
3
fredericdnd

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
3
Claudia Fitero