ios UIViewContentModeScaleAspectFill non écrêtage



uiimageview contentmode (5)

Si vous voulez élargir vos connaissances, il y a un très bon article sur le rendu de la pile iOS UIView . Il y a aussi un article plus détaillé sur l' ensemble du pipeline de dessin .

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 un contenu de sous-vue. Cette pixellisation prend en compte la propriété contentMode .

    Tout ce qui est en dehors des limites d'une vue est ignoré.

  2. Composition - Les résultats sont combinés (dessinés les uns au-dessus des autres) à partir de la sous-vue jusqu'aux superviews. Cela utilise la propriété frame de la sous-vue.

    Si la propriété clipsToBounds est clipsToBounds sur YES sur la vue supérieure, elle rejette le contenu de la sous- vue en dehors de ses limites.

UIImageView de dessiner des images miniatures à une taille fixe (100x100) en utilisant UIImageView . J'ai défini la taille d'image de ma vue d'image à 100x100 et définissez le UIViewContentModeScaleAspectFill à UIViewContentModeScaleAspectFill .

Ma compréhension est que cela devrait causer l'image à dessiner à la taille que j'ai définie, et l'image remplira la zone de l'image, et couper toutes les parties de l'image qui sont en dehors de la taille que j'ai définie pour la vue d'image. Cependant, l'image est toujours dessinée plus grande ou plus petite que la taille 100x100 que je lui ai fixée.

Si je définis le UIviewContentModeScaleToFill sur UIviewContentModeScaleToFill , l'image est dessinée exactement à 100x100, mais elle est déformée pour s'adapter à ces dimensions. Des idées pour lesquelles l'aspect remplir n'est pas découpé 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 UIImageView je travaille. J'ai mis leur couleur de fond au vert, et le cadre de la vue à 100x100. En tant que test, les UIImageViews sont dimensionnés à 50x50. Comme vous pouvez le voir, lorsque vous utilisez le ...AspectFill , les images ne sont pas dimensionnées à 50x50 et, dans certains cas, sont décalées par rapport à l'endroit où je les aimerais. Lorsque vous utilisez ...ScaleToFill , ils sont correctement dimensionnés, mais l'image est déformée.


Answer #1

La vérification des "sous-vues de clips" directement dans le Storyboard / Xib a également fonctionné pour moi.


Answer #2

Si tout échoue,

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

Exemple :

  override func viewDidLayoutSubviews() {

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

Answer #3

Pouvez-vous essayer de définir le clip aux limites

[_photoview setClipsToBounds:YES];

Ou directement dans votre Storyboard / Xib si vous pouvez:


Answer #4

Mes sous-vues se redimensionnaient et je me suis rendu compte que c'était parce que le xib avait un ensemble de mise en page automatique:





uiimageview