Ios 具有自动布局和最大尺寸保持纵横比的UIImageView

Ios 具有自动布局和最大尺寸保持纵横比的UIImageView,ios,objective-c,uiimageview,autolayout,Ios,Objective C,Uiimageview,Autolayout,我在源代码中生成了一个UIImageView(以编程方式)。对于宽度和高度,UIImageView需要有一个最大尺寸。在这个视图中,我从URL加载一个图像,并在下载结束后进行设置。我以前不知道图像的大小,但我需要保持纵横比,并使UIImageView具有保持该纵横比的大小 如果图像在一维或二维中较小,我希望UIImageView具有在不拉伸图像的情况下保持纵横比所需的大小 考虑到UIImageView和250x350的最大大小,我将给出两个示例 示例1: 图像大小为800 X 800。 UIIm

我在源代码中生成了一个
UIImageView
(以编程方式)。对于宽度和高度,
UIImageView
需要有一个最大尺寸。在这个视图中,我从URL加载一个图像,并在下载结束后进行设置。我以前不知道图像的大小,但我需要保持纵横比,并使
UIImageView
具有保持该纵横比的大小

如果图像在一维或二维中较小,我希望
UIImageView
具有在不拉伸图像的情况下保持纵横比所需的大小

考虑到
UIImageView
250x350
的最大大小,我将给出两个示例

示例1:

图像大小为
800 X 800
UIImageView
的大小需要为
250 X 250

示例2:

图像大小为
200 X 250
UIImageView
的大小需要为
200x250


如何使用自动布局来实现这一点。

这里需要三个约束条件。一个用于保持纵横比,一个用于确保宽度不大于最大值,另一个用于确保高度不大于最大值。截至2016年8月,Interface Builder不支持引用其他约束的约束,因此至少必须在代码中完成纵横比约束

纵横比是唯一需要考虑的因素。让V_w和V_h分别为图像视图的宽度和高度。让I_w和I_h分别为图像的宽度和高度。然后,要保持图像的纵横比,以下等式必须保持为真:

或者,相当于:

好的,看起来不错。让我们编写一些代码。在这段代码中,我假设前面定义了
MAX_HEIGHT
MAX_WIDTH
注意此代码必须针对iOS 9.0或更高版本。如果您的目标是较早版本的iOS,请参见下面的方框

// Constrain the desired aspect ratio
[imageView.widthAnchor constraintEqualToAnchor:imageView.heightAnchor
                                    multiplier:aspectRatioMult].active = YES;

// Constrain height
[imageView.heightAnchor constraintLessThanOrEqualToConstant:MAX_HEIGHT].active = YES;

// Constrain width
[imageView.widthAnchor constraintLessThanOrEqualToConstant:MAX_WIDTH].active = YES;

对于针对9.0之前的iOS版本的代码,
nslayoutachor
不可用。相反,您必须使用
NSLayoutConstraint
进行到期

CGFloat aspectRatioMult = (imageView.image.size.width / imageView.image.size.height);

// Constrain the desired aspect ratio
[imageView addConstraint:
  [NSLayoutConstraint constraintWithItem:imageView
                               attribute:NSLayoutAttributeWidth
                               relatedBy:NSLayoutRelationEqual
                                  toItem:imageView
                               attribute:NSLayoutAttributeHeight
                              multiplier:aspectRatioMult
                                constant:0]];

// Constrain height
[imageView addConstraints:
  [NSLayoutConstraint constraintsWithVisualFormat:@"V:[imageView(<=max)]"
                                          options:0
                                          metrics:@{@"max" : @(MAX_HEIGHT)}
                                            views:@{@"imageView" : imageView}]];

// Constrain width
[imageView addConstraints:
  [NSLayoutConstraint constraintsWithVisualFormat:@"H:[imageView(<=max)]"
                                          options:0
                                          metrics:@{@"max" : @(MAX_WIDTH)}
                                            views:@{@"imageView" : imageView}]];
CGFloat aspectRatioMult=(imageView.image.size.width/imageView.image.size.height);
//约束所需的纵横比
[imageView添加约束:
[NSLayoutConstraint constraintWithItem:imageView
属性:NSLAYUTATTRIBUTEWIDTH
关系人:NSLayoutRelationEqual
toItem:imageView
属性:NSLayoutAttributeHeight
乘数:aspectRatioMult
常数:0]];
//约束高度
[imageView添加约束:

[NSLayoutConstraint constraintsWithVisualFormat:@“V:[imageView(在您的第一个示例中,它不是应该是250 x 250吗?350 x 350比您的最大尺寸大。抱歉,Shawn,您是对的,这是我的错误。在Storyboard中如何做到这一点?@RodrigoRuiz您将无法在Interface Builder(又名Storyboard)中创建适当的约束。我在答案中添加了这样的注释。iOS代码中有一个错误9.0之前的版本。必须交换最大高度和最大宽度。