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
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.
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)
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
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
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
}
}
}
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
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()
}
}
}
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();
});
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];
});
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.