Storyboard et autolayout: comment faire une image circulaire

dans storyboard (xcode 6) je veux un profil d'image user circulaire prendre de Facebook.

J'ai donc fait cette interface dans le storyboard, en utilisant la layout automatique:

entrez la description de l'image ici

Ensuite, en utilisant Facebook iOS sdk je prends le profil de l'user (en utilisant swift):

var facebookProfileUrl = "http://graph.facebook.com/\(userId!)/picture?type=normal"; 

Dans le storyboard, j'ai réglé l'image sur le mode "Scale to fit". Pour rendre circulaire l'image, j'utilise le code suivant:

 self.facebookProfileImage.layer.cornerRadius = self.facebookProfileImage.frame.size.width / 2; self.facebookProfileImage.clipsToBounds = true; 

Quand je cours le code, de toute façon l'image n'a pas l'air circulaire:

entrez la description de l'image ici

Je suppose que le problème est la layout automatique, mais je ne suis pas sûr. Comment puis-je rendre l'image parfaitement circulaire?

Deux étapes:

  1. Centrez l'UIImageView en ajoutant une contrainte "Horizontal Center In Container" (Editeur> Aligner> Horizontal Center in Container) sur UIImageView.
  2. Supprimez les contraintes de début et de fin que vous avez actuellement définies sur UIImageView.

Pourquoi? UIImageView est étiré car la layout automatique doit prendre en count les contraintes de début et de fin que vous avez définies dans UIImageView. Pour prouver mon point, définissez la priorité des contraintes de début et de fin à quelque chose de less que la priorité des contraintes de hauteur et de largeur. Vous devriez voir une image arrondie comme vous l'attendez, mais elle peut ne pas être cinput.

J'ai fait la même chose il y a un peu de time et cela a fonctionné pour moi

 self.imageView.image = [ImageHelper getImage]; //resortingeve image self.imageView.layer.cornerRadius = self.imageView.frame.size.height / 2; self.imageView.layer.masksToBounds = YES; self.imageView.layer.borderWidth = 0; self.imageView.contentMode = UIViewContentModeScaleAspectFill; 

Lors de l'ajout de la contrainte, assurez-vous de vérifier la hauteur et la largeur de façon à ce qu'elle soit corrigée. Au less, ce que je fais toujours.

entrez la description de l'image ici

Vous avez donné leading constraint, trailing constraint et une width constraint. Ainsi, l'image va essayer de laisser 130 pixels avant et après l'image ce qui va augmenter la largeur de l'image.

 So the solution is, remove either one of the leading or trailing constraint. 

La meilleure solution consiste à supprimer la contrainte et à append une contrainte de centre horizontal, c'est ce que vous voulez.

SWIFT 3.x Changez simplement votre class personnalisée imageView avec ceci et appréciez.

 @IBDesignable class RoundedImageView:UIImageView { @IBInspectable var borderColor:UIColor = UIColor.white { willSet { layer.borderColor = newValue.cgColor } } override func layoutSubviews() { super.layoutSubviews() layer.cornerRadius = frame.height/2 layer.masksToBounds = true layer.borderWidth = 1 layer.borderColor = borderColor.cgColor } } 

Plus d'étapes:

  1. Ajouter une contrainte de ratio d'aspect 1: 1
  2. marquer le clip dans les limites de l' atsortingbut dans l' inspecteur d' attributes
  3. faire de sortie de votre vue dans votre class de controller
  4. définir le rayon de l'angle à la moitié de sa hauteur ou de sa largeur

    yourImageViewOutlet.layer.cornerRadius = votreImageViewOutlet.frame.size.width / 2.0

En storyboard j'ai mis l'image en mode "Scale to fit"

Mais c'est un problème, n'est-ce pas? Cela signifie: "Étirer l'image de sorte qu'elle corresponde à la façon dont la vue de l'image est étirée." Si ce n'est pas ce que tu veux, ne dis pas ça! Utilisez Centré, ou au less utilisez l'un des modes de contenu avec "Aspect" dans son nom afin que votre image ne soit pas étirée.

Quant au cercle lui-même, régler le cornerRadius n'est pas un moyen de faire un cercle. La façon de créer une limite circulaire autour d'une image est de masquer l'image. Vous pouvez redessiner l'image avec le masque circulaire en tant que limite de découpage, ou vous pouvez appliquer le masque circulaire à la vue de l'image. (Voir, par exemple, ma réponse ici: https://stackoverflow.com/a/16475824/341994 .)

Il est vrai que votre vue d'image est également étirée, parce que vous lui avez donné des contraintes des deux côtés de l'aperçu. Vous pouvez empêcher cela en lui donnant une contrainte de largeur à la place; maintenant sa largeur sera absolue. Mais vous devriez toujours faire la bonne chose sur les deux autres questions.