web-dev-qa-db-fra.com

cornerRadius a cessé de fonctionner dans Swift 2.3 / iOS 10 / Xcode 8

J'ai un cornerRadius défini sur un UIView et un UIImageView à l'intérieur du même UIView. Je calcule le rayon du coin avec RockProfileView.frame.size.height / 2 mais UIView a cessé de s'afficher dans iOS 10.

Après vérification, j'ai trouvé la valeur de RockProfileView.frame.size.height / 2 sort pour être 1000.0 tandis que la contrainte de largeur et hauteur est définie sur 64.0

Quand j'ai codé en dur le RockProfileView.layer.cornerRadius = 32 à 64/2 cela fonctionne très bien.

Quel pourrait être le problème?

Code complet:

    RockProfileView.layer.cornerRadius = RockProfileView.frame.size.height / 2
    RockProfileView.clipsToBounds = true
    RockProgressView.layer.masksToBounds = true
30
Ankit Khanna

Comme l'a répondu Rob, j'ai déplacé le code de viewDidLoad vers viewDidAppear et le problème est résolu.

OU L'ajout de self.view.layoutIfNeeded() avant votre code dans viewDidLoad résout également le problème.

Dans le cas de UITableViewCell, Inside awakeFromNib add [self layoutIfNeeded]; avant de mettre à jour le rayon d'angle devrait résoudre tous les problèmes.

32
Ankit Khanna

J'ai terminé ce code dans awakeFromNib, mais après la mise à niveau vers ios 10 + xcode 8, il a cessé de fonctionner.

Ensuite, j'ai déplacé ce code vers la méthode layoutSubViews. Ensuite, cela a fonctionné.

En espérant que cela vous sera utile.

Si vous souhaitez toujours le faire dans awakefromnib, faites-le après avoir mis un certain délai (en utilisant dispatch_after ou NSOperatinQueue ou performSelectorWithDelay)

8
Mehul Thakkar

S'il se trouve dans l'un de ViewControllers, au lieu de déplacer toutes les opérations de calque vers viewDidLayer, déplacez ce code à l'intérieur de DispatchQueue. Cela a fonctionné pour moi:

DispatchQueue.main.async {
            let layer = self.signUpBtn.layer
            layer.borderColor = UIColor.white.cgColor
            layer.borderWidth = 2 / UIScreen.main.scale
        }

J'espère que cela vous aide

4
YPK

Nouveau dans XCode8, nous ne pouvons pas définir directement le cornerRadius du calque.

Lorsque vous souhaitez appliquer cornerRadius de UIView, vous devez ajouter une ligne de code avant d'appliquer cornerRadius.

yourButton.layoutIfNeeded ()

Exemple dans l'objectif C.

[yourButton layoutIfNeeded];
yourButton.layer.cornerRadius = yourButton.frame.size.height/2;
[[yourButton layer] setBorderWidth:2.0f];
Example into Swift3

self.layoutIfNeeded()
yourButton.layer.cornerRadius = self.frame.height / 2.0
yourButton.layer.borderWidth = 2.0
3
Sunil aruru

Pour moi, ce qui a fonctionné a été la première mise en page des appels, si nécessaire et plus tard le set cornerRadius

Marqué avec @IBInspectable dans Swift (ou IBInspectable dans Objective-C), ils sont facilement modifiables dans le panneau d'inspection des attributs d'Interface Builder.
Vous pouvez définir directement cornerRadius dans l'inspecteur d'attributs

extension UIView {

  @IBInspectable var cornerRadius: CGFloat {

   get{
        return layer.cornerRadius
    }
    set {
        layer.cornerRadius = newValue
        layer.masksToBounds = newValue > 0
    }
  }
}
1
Amit Jagesha シ

Swift 3

Je vais essayer ce code pour définir le rayon de coin de UIImageview

 imgProfile.layer.cornerRadius = imgProfile.frame.size.width / 2
            imgProfile.clipsToBounds = true
1
Amul4608

Solution Swift 3.2

Si quelqu'un a toujours ce problème, j'ai résolu le problème en arrondissant les cellules (ou l'une de ses sous-vues) dans viewDidLayoutSubviews.

override func viewDidLayoutSubviews() {
    if (tableView.visibleCells.count > 0) {
        for cell in tableView.visibleCells {
            let customCell = cell as! CustomCell
            // Use any rounding method you use
            customCell.exampleSubview.roundCorners(corners: .allCorners, radius: 6) 
            customCell.exampleSubview.layoutIfNeeded()
        }
    }
}
0
Herman Coma

J'ai eu le même problème, iOS 10 uniquement. J'ai trouvé que ViewDidLayoutSubviews ou ViewDidLoad (peut-être d'autres aussi mais je n'ai pas vérifié) ne fonctionnait que si j'enveloppais le code de mise en page dans la file d'attente de répartition comme le suggérait YPK.

J'utilise Xamarin donc la syntaxe est un peu différente:

DispatchQueue.MainQueue.DispatchAsync(() =>
        {
            SetYourViewProperties();
        });
0
Ryan

J'ai dû l'exécuter sur le thread principal pour que cela fonctionne.

    dispatch_async(dispatch_get_main_queue(), ^{
       [imageView.layer setCornerRadius:4];
       [imageView.layer setMasksToBounds:YES];
});
0
nithinreddy

Comme mentionné dans une réponse précédente, l'ajout de self.layoutIfNeeded() avant de changer le rayon d'angle a fonctionné pour moi.

0
A. Edwards