web-dev-qa-db-fra.com

La disposition automatique continue d'étirer UIImageView

J'utilise la disposition automatique et cela me rend fou. J'ai fait tout mon possible pour empêcher UIImageView de s'étirer partout. Je ne sais pas pourquoi ça fait ça. J'ai essayé d'utiliser des contraintes, de résoudre des problèmes de mise en page automatique. Pour l'instant, la seule solution consistait à transformer la mise en page automatique elle-même.

Quelqu'un pourrait-il me dire pourquoi xcode ignore complètement mes contraintes? Je m'attendrais à ce que l'UIImage reste en 320x320 quand je l'ai explicitement défini comme ça, mais noooooooo ....

Je veux publier des images, mais le site ne me le permet pas, et je voudrais ajouter du code à cette question afin qu'elle soit plus spécifique, mais il n'y a littéralement pas de code du tout. Je viens de faire glisser "UIImageView" depuis le storyboard, je l'ai fait petit, j'ai défini les contraintes telles quelles, et il ignore simplement mon code.

31
Gyuhyeon Lee

Vous voudrez vous assurer que votre UIImageView est réglé pour couper les limites. Sinon, l'image sortira de la vue et semblera ne pas s'étirer correctement (même si en réalité c'est le cas).

Dans le générateur d'interface, assurez-vous que la case Clip Subviews est cochée.

enter image description here

Si vous n'utilisez pas le générateur d'interface, le code suivant fera la même chose:

yourImageView.clipsToBounds = YES;
48
Travis

Avec la mise en page automatique, les valeurs de l'inspecteur de taille sont à peu près ignorées.

Anything you enter here will be ignored

Vous pouvez vous attendre à ce que si un nombre est tapé dans les cases de l'inspecteur de taille, Xcode crée automatiquement des contraintes pour refléter ce que vous avez tapé, mais ce n'est pas le cas. Vous devez créer vous-même des contraintes "Pin" pour la hauteur et la largeur de votre UIImageView.

  • Sélectionnez la vue d'image sur votre storyboard
  • Cliquez sur le bouton "Épingler" en bas à droite de l'écran du storyboard
  • Tapez la taille souhaitée dans les champs "Largeur" ​​et "Hauteur" et assurez-vous que les cases sont cochées
  • Cliquez sur le bouton "Ajouter 2 contraintes"

    enter image description here

Lorsque vous avez terminé, vous devriez pouvoir voir vos contraintes dans l'inspecteur de taille sur le côté droit de l'écran (les cases violettes)

enter image description here

7
GeneralMike

Mon problème était avec les ContentHuggingPriority et ContentCompressionResistancePriority.

Le premier contrôle à quel point il est important de garder la vue en "serrant" l'image (en restant près d'elle et sans l'agrandir) et le second contrôle la résistance à la compression de la vue.

Nous utilisons PureLayout , donc le code pour le corriger était:

[NSLayoutConstraint autoSetPriority:ALLayoutPriorityRequired forConstraints:^{
    [myImageView autoSetContentCompressionResistancePriorityForAxis:ALAxisHorizontal];
    [myImageView autoSetContentHuggingPriorityForAxis:ALAxisHorizontal];
}];

(mon problème était uniquement dans l'axe horizontal)

15 mai 2016: Mise à jour vers la syntaxe PureLayout v3. Si vous utilisez une version <= 2, mettez simplement UIView au lieu de NSLayoutConstraint. Merci Rudolf J !

5
Noam Nelke

J'ai eu le même problème. J'ai ajouté un UIImageView dans une cellule prototype et j'ai voulu l'aligner à côté du texte mais il a continué d'étirer l'image lorsque j'ai appliqué les contraintes. Dans mon cas, j'ai changé la propriété 'Mode' pour la vue d'image en 'Aspect Fit' et cela a bien fonctionné . enter image description here

3
JanB

Vous pouvez essayer d'ajouter UIImageView par programme. Appelez ce code dans votre méthode viewDidLoad ou où vous le souhaitez.

UIImageView *yourImageView = [[UIImageView alloc]initWithFrame:CGRectMake(50.0f, 50.0f, 320.0f, 320.0f)]; // x and y coordinates, width and height of UIImageView
[yourImageView setImage:[UIImage imageNamed:@"your_image.png"]];
[yourImageView setContentMode:UIViewContentModeCenter]; // you can try use another UIViewContentMode

[self.view addSubview:yourImageView];
0
Ilya Dmitriev