web-dev-qa-db-fra.com

UIViewContentModeScaleAspectFill n'est pas écrêté

J'essaie de dessiner des images miniatures à une taille fixe (100x100) en utilisant UIImageView. J'ai défini la taille du cadre de ma vue d'image sur 100x100, et le paramètre contentMode sur UIViewContentModeScaleAspectFill.

Si j'ai bien compris, cela devrait entraîner le dessin de l'image à 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 plus grande ou plus petite que la taille 100x100 que je lui ai définie.

Si je règle contentMode sur UIviewContentModeScaleToFill, l'image est dessinée à exactement 100x100, mais elle est déformée pour tenir dans ces dimensions. Des idées pour lesquelles l'aspect de remplissage ne coupe pas 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 les UIImageView avec lesquels je travaille. J'ai défini la couleur d'arrière-plan sur le vert et le cadre de la vue sur 100x100. À titre de test, les 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, sont décalées de celles souhaitées. Lorsque vous utilisez ...ScaleToFill, leur taille est correcte mais l’image est déformée.

Screenshot illustrating problem

144
Josh Buhler

Pouvez-vous essayer de régler le clip sur les limites

[_photoview setClipsToBounds:YES];

Ou directement dans votre Storyboard/Xib si vous pouvez:

enter image description here

351
imthi

Si vous souhaitez approfondir vos connaissances, vous trouverez un très bon article sur le rendu de la pile pile UIView iOS . Il existe également un article plus détaillé sur le pipeline de dessin entier .

En résumé:

  1. Rasterisation - Tout le contenu de la vue est pixellisé (tracé ou tampon de pixels hors écran) dans l'espace de coordonnées des limites de la vue. Cela peut être des données d'image ou un dessin personnalisé (c'est-à-dire drawRect:) mais le contenu de la sous-vue. Cette pixellisation prend en compte la propriété contentMode.

    Tout ce qui est en dehors des limites d’une vue est jeté.

  2. Composition - Les résultats sont composés (dessinés les uns sur les autres) d'une sous-vue à une vue d'ensemble. Ceci utilise la propriété frame de la sous-vue.

    Si la propriété clipsToBounds est YES dans la vue d'ensemble, elle supprimera le contenu de la sous-vue en dehors de ses limites.

8
Robert

avait le même problème et il a été résolu en cochant "Clip Subviews".

L'image apparaissait correctement pour toutes les vues (3.5,4,4,4,7,5.5, ipad) dans l'aperçu du storyboard, mais pas dans le simulateur.

Après avoir coché "Clip Subviews", le problème a été résolu. :)

2

Vérifier "Clip subviews" directement dans le Storyboard/Xib a également fonctionné pour moi. enter image description here

1
Maxime T

Si tout échoue,

faire les clips aux limites dans la méthode viewDidLayoutSubviews.

Exemple :

  override func viewDidLayoutSubviews() {

    imageProfile.layer.cornerRadius = imageProfile.bounds.size.width/2
    imageProfile.clipsToBounds = true
    imageProfile.layer.masksToBounds = true
 }
0
bharathi kumar

Mes sous-vues étaient en train de redimensionner et je me suis rendu compte que c’était parce que la xib disposait de la disposition automatique: enter image description here

0
alistair