对齐UIImageView与纵横匹配 [英] Alignment UIImageView with Aspect Fit

查看:98
本文介绍了对齐UIImageView与纵横匹配的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

解决方案

对于我的UIImageView我选择了Aspect Fit(InterfaceBuilder),但是如何改变垂直对齐?这个代码是一个有点发霉从2011年,所有,但我成立@ ArtOfWarefare的mods]



你不能这样做/ UIImageView。我创建了一个简单的UIView子类 MyImageView ,其中包含一个UIImageView。

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

@interface MyImageView:UIView {
UIImageView * _imageView;
}

@property(nonatomic,assign)UIImage * image;

@end

  // MyImageView.m 

#importMyImageView.h

@implementation MyImageView

@dynamic image;

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

- (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];

//初始化框架与imageView的大小相同
self.frame = _imageView.bounds;
}
return self;
}

//如果使用ARC,删除此函数
- (void)dealloc
{
[_imageView release];
[super dealloc];
}

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

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

- (void)layoutSubviews
{
if(!self.image)return;

//计算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(widthScaleFactor> heightScaleFactor){
imageViewWidth = self。 image.size.width * widthScaleFactor;
imageViewHeight = self.image.size.height * widthScaleFactor;
}

//如果图像宽和短,缩放到高度,水平对齐
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


for my UIImageView I choose Aspect Fit (InterfaceBuilder) but how can I change the vertical alignment?

解决方案

[EDIT - this code is a bit moldy being from 2011 and all but I incorporated @ArtOfWarefare's mods]

You can't do this w/ UIImageView. I created a simple UIView subclass MyImageView that contains a UIImageView. Code below.

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

@interface MyImageView : UIView {
    UIImageView *_imageView;
}

@property (nonatomic, assign) UIImage *image;

@end

and

// MyImageView.m

#import "MyImageView.h"

@implementation MyImageView

@dynamic image;

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

- (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;
}

// Delete this function if you're using ARC
- (void)dealloc
{
    [_imageView release];
    [super dealloc];
}

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

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

- (void)layoutSubviews
{
    if (!self.image) return;

    // 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

这篇关于对齐UIImageView与纵横匹配的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆