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

时间:2015-03-26 20:16:16

标签: ios objective-c uiimageview autolayout

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

如果图像较小,在一个或两个维度上,我希望UIImageView具有保持纵横比所需的大小而不会拉伸图像。

我会考虑UIImageView 250 X 350的最大尺寸给出两个例子。

示例1:

图片尺寸为800 X 800UIImageView的大小必须为250 X 250

示例2:

图片尺寸为200 X 250UIImageView的大小必须为200 X 250

如何使用自动布局执行此操作。

1 个答案:

答案 0 :(得分:6)

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

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

V_w / V_h = I_w / I_h

或等同地:

V_w = (I_w / I_h) * V_h

好的,看起来不错。让我们写一些代码。在此代码中,我假设您之前已定义MAX_HEIGHTMAX_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版本的代码,NSLayoutAnchor不可用。相反,您必须使用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}]];