144 votes

UIViewContentModeScaleAspectFill ne s'écrête pas

J'essaie de dessiner des vignettes à une taille fixe (100x100) en utilisant la fonction UIImageView . J'ai réglé la taille du cadre de ma vue d'image sur 100x100, et j'ai réglé l'option contentMode à UIViewContentModeScaleAspectFill .

Si j'ai bien compris, l'image devrait être dessinée à la taille que j'ai définie, et l'image remplira la zone de l'image, et coupera toutes les parties de l'image qui sont en dehors de la taille que j'ai définie pour la vue de l'image. Cependant, l'image est toujours dessinée plus grande ou plus petite que la taille 100x100 que j'ai définie pour elle.

Si je règle le contentMode à UIviewContentModeScaleToFill L'image est alors dessinée à la taille exacte de 100x100, mais elle est déformée pour entrer dans ces dimensions. Avez-vous une idée de la raison pour laquelle le remplissage de l'aspect n'est pas écrêté comme prévu ?

Voici mon code :

_photoView = [[UIImageView alloc] initWithImage:photoImage];
_photoView.contentMode = UIViewContentModeScaleAspectFill;
[self addSubview:_photoView];

CGRect photoFrame = _photoView.frame;
photoFrame.size = CGSizeMake(100, 100);
_photoView.frame = photoFrame;

Pour mieux illustrer, voici une capture d'écran de ce que je vois. Les carrés verts sont les UIView contenant le UIImageView avec lesquels je travaille. J'ai défini leur couleur de fond en vert et le cadre de la vue en 100x100. En guise de test, le UIImageViews ont une taille de 50x50. Comme vous pouvez le constater, lorsque vous utilisez le ...AspectFill Les images ne sont pas au format 50x50, et dans certains cas, elles sont décalées par rapport à ce que je voudrais. Lorsque vous utilisez ...ScaleToFill ils sont correctement dimensionnés, mais l'image est déformée.

Screenshot illustrating problem

351voto

imthi Points 2242

Pouvez-vous essayer de définir le clip sur les limites

[_photoview setClipsToBounds:YES];

8voto

Robert Points 10822

Si vous voulez approfondir vos connaissances, il existe un très bon article sur la façon dont l'industrie de l'aviation est organisée. iOS UIView la pile est rendue . Il existe également un article plus approfondi sur le toute la chaîne de dessin .

En résumé :

  1. Rastérisation - Tout le contenu de la vue est tramé (dessiné ou dans un tampon de pixels hors écran) dans l'espace de coordonnées des limites de la vue. Il peut s'agir de données d'image ou d'un dessin personnalisé (par ex. drawRect: ) mais le contenu de la sous-vue. Ce tramage tient compte de la contentMode propriété.

    Tout ce qui se trouve en dehors des limites d'une vue est écarté.

  2. Composition - Les résultats sont composés (dessinés les uns sur les autres) de la vue secondaire à la vue supérieure. Cette opération utilise la propriété frame de la sous-vue.

    Si le clipsToBounds la propriété est YES sur la vue supérieure, il rejettera vue secondaire le contenu en dehors de ses limites.

0voto

alistair Points 659

Mes sous-vues se redimensionnaient et j'ai réalisé que c'était parce que le xib avait une mise en page automatique : enter image description here

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X