2
votes

Réglez automatiquement le rayon d'angle d'UIView sur la moitié de la largeur de la vue

J'ai quelques vues dont la taille n'est pas codée en dur, mais déterminée via des contraintes et j'ai besoin que ces vues soient arrondies.
Existe-t-il un moyen de définir la propriété cornerRadius "dynamiquement", par exemple en fonction de la taille réelle de l'objet?
Je sais que si cette vue est à l'intérieur d'un UIViewController, je peux obtenir la largeur via roundView.frame.width et définir la propriété layer.cornerRadius ici, mais les vues rondes ne sont pas contenues dans un viewController, mais géré par un autre UIView simple.
Merci d'avance!
Dave


0 commentaires

3 Réponses :


7
votes

Vous pouvez remplacer la méthode layoutSubviews de la classe View et y définir la valeur cornerRadius. Disons que vous voulez que cornerRadius soit la moitié de la largeur de la vue:

override func layoutSubviews() {
    super.layoutSubviews()
    self.layer.cornerRadius = self.bounds.width * 0.5
}


3 commentaires

Et généralement une bonne idée d'ajouter un imo super.layoutSubviews () .


@TravisGriggs ah définitivement, merci pour le commentaire. J'ai mis à jour la réponse :))


En fait, je l'ai fait sans y penser, presque comme une procédure standard à mon humble avis: D Mais merci pour l'indice et les réponses mises à jour 👍



0
votes

Accédez-y simplement via votre vue simple qui les contient. Si votre vue de conteneur simple n'a pas ces vues rondes en tant qu'instances, vous pouvez y accéder en itérant dans son tableau de sous-vues. Lorsque vous obtenez la vue, vous pouvez accéder à leur frame.size.width et définir la propriété de rayon layer.corner sur cette valeur.


2 commentaires

La question est de savoir quand la vue du conteneur connaîtra-t-elle la taille réelle de la sous-vue? Parce que dans la méthode init (), il me dit 512px alors qu'en réalité c'est 60.


Eh bien, je pense qu'il ne peut pas connaître la taille réelle dans la méthode init car son cadre est défini par le contrôleur qui le présente. Vous pouvez définir le cadre dans init mais il peut être modifié par le contrôleur. Vous pouvez donc essayer d'y accéder dans le contrôleur et en ajoutant le rayon du coin et non dans la méthode init.



1
votes

Facile à réaliser avec RxSwift en observant Key Path.

 let update: UIButton = {
     let btn = UIButton()
     // more config
     btn.cornerHalf()
     return btn
 }()

Il suffit d'appeler la méthode init , le code semble plus simple par déclaration, au lieu d'être distribué deux endroit. Surtout, la logique est couramment utilisée dans votre projet.

Appelez comme ceci:

extension UIView{

    func cornerHalf(){
        clipsToBounds = true
        rx.observe(CGRect.self, #keyPath(UIView.bounds))
            .subscribe(onNext: { _ in
                self.layer.cornerRadius = self.bounds.width * 0.5
            }).disposed(by: rx.disposeBag)
    }
}


0 commentaires