pour UIImageView, je choisis Aspect Fit (InterfaceBuilder), mais comment puis-je modifier l’alignement vertical?
Réponses
Trop de publicités? 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
C'est une solution géniale: https://github.com/reydanro/UIImageViewAligned
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.
J'ai appliqué la rétine 4 facteur de forme (de l'Éditeur->Appliquer le Retina de 4 Facteur de Forme).
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.
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.