85 votes

Alignement UIImageView avec Aspect Fit

pour UIImageView, je choisis Aspect Fit (InterfaceBuilder), mais comment puis-je modifier l’alignement vertical?

41voto

XJones Points 14327

Vous ne pouvez pas faire cela avec UIImageView. J'ai créé une simple sous-classe UIView MyImageView qui contient un UIImageView. Code ci-dessous.

 // MyImageView.h
#import <UIKit/UIKit.h>

@interface MyImageView : UIView {
    UIImageView *_imageView;
}

@property (nonatomic, assign) UIImage *image;

@end
 

et

 // MyImageView.m

#import "MyImageView.h"

@implementation MyImageView

@dynamic image;

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        self.clipsToBounds = YES;
        _imageView = [[UIImageView alloc] initWithFrame:self.bounds];
        _imageView.contentMode = UIViewContentModeScaleAspectFill;
        [self addSubview:_imageView];
    }
    return self;
}

- (id)initWithImage:(UIImage *)anImage
{
    self = [self initWithFrame:CGRectZero];
    if (self) {
        _imageView.image = anImage;
        [_imageView sizeToFit];

        // initialize frame to be same size as imageView
        self.frame = _imageView.bounds;        
    }
    return self;
}

- (void)dealloc
{
    [_imageView release];
    [super dealloc];
}

- (UIImage *)image
{
    return _imageView.image;
}

- (void)setImage:(UIImage *)anImage
{
    _imageView.image = anImage;
    [self setNeedsLayout];
}

- (void)layoutSubviews
{
    // compute scale factor for imageView
    CGFloat widthScaleFactor = CGRectGetWidth(self.bounds) / self.image.size.width;
    CGFloat heightScaleFactor = CGRectGetHeight(self.bounds) / self.image.size.height;

    CGFloat imageViewXOrigin = 0;
    CGFloat imageViewYOrigin = 0;
    CGFloat imageViewWidth;
    CGFloat imageViewHeight;


    // if image is narrow and tall, scale to width and align vertically to the top
    if (widthScaleFactor > heightScaleFactor) {
        imageViewWidth = self.image.size.width * widthScaleFactor;
        imageViewHeight = self.image.size.height * widthScaleFactor;
    }

    // else if image is wide and short, scale to height and align horizontally centered
    else {
        imageViewWidth = self.image.size.width * heightScaleFactor;
        imageViewHeight = self.image.size.height * heightScaleFactor;
        imageViewXOrigin = - (imageViewWidth - CGRectGetWidth(self.bounds))/2;
    }

    _imageView.frame = CGRectMake(imageViewXOrigin,
                                  imageViewYOrigin,
                                  imageViewWidth,
                                  imageViewHeight);
}

- (void)setFrame:(CGRect)frame
{
    [super setFrame:frame];
    [self setNeedsLayout];
}

@end
 

4voto

Jonathan Molina Points 109

Essayer ensemble

imageView.contentMode = UIViewContentModeScaleAspectFit; imageView.clipsToBounds = YES;

Ce travail pour moi.

3voto

snowman4415 Points 415

C'est une solution géniale: https://github.com/reydanro/UIImageViewAligned

2voto

GLee Points 981

Je sais que c'est un vieux thread, mais j'ai pensé que je devais partager ce que j'ai fait pour changer facilement la région écrêtée à partir du haut vers le bas de l'affichage de l'image dans Interface Builder, au cas où quelqu'un avait le même problème, je l'ai fait. J'ai eu une UIImageView qui a rempli la Vue de mon ViewController, et a été d'essayer de faire un top de rester le même, indépendamment de la taille de l'écran de l'appareil.

  1. J'ai appliqué la rétine 4 facteur de forme (de l'Éditeur->Appliquer le Retina de 4 Facteur de Forme).

  2. J'ai épinglé la hauteur et la largeur.

Maintenant, lorsque l'écran change de taille, le UIImageView est en fait la même taille, et la vue-contrôleur des clips de ce qui est hors de l'écran. L'image d'origine reste à 0,0, de sorte que le bas et à droite de l'image sont coupées, pas le top.

Espérons que cette aide.

1voto

George Points 2546

Vous pouvez le faire en le redimensionnant puis en le redimensionnant. La chose à mentionner ici est que j'ai été conditionné par la hauteur. Je veux dire, je devais avoir une image de 34px haute et peu importe la largeur.

Obtenez donc le rapport entre la hauteur réelle du contenu et la hauteur de la vue (34 px), puis redimensionnez également la largeur.

Voici comment je l'ai fait:

 CGSize size = [imageView sizeThatFits:imageView.frame.size];

CGSize actualSize;
actualSize.height = imageView.frame.size.height;
actualSize.width = size.width / (1.0 * (size.height / imageView.frame.size.height));

CGRect frame = imageView.frame;
frame.size = actualSize;
[imageView setFrame:frame];
 

J'espère que cela t'aides.

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