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

Posted

技术标签:

【中文标题】具有自动布局和最大尺寸保持纵横比的 UIImageView【英文标题】:UIImageView with auto-layout and max size keeping aspect ratio 【发布时间】:2015-03-26 20:16:16 【问题描述】:

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

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

我将给出两个示例,考虑 UIImageView250 X 350 的最大大小。

示例 1:

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

示例 2:

图片大小为200 X 250UIImageView 的大小需要为200 X 250

如何使用自动布局来做到这一点。

【问题讨论】:

在您的第一个示例中,不应该是 250 x 250 吗? 350 x 350 大于您的最大尺寸。 对不起,肖恩,你是对的,是我的错。 【参考方案1】:

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

纵横比是唯一需要考虑的因素。让 V_w 和 V_h 分别是图像视图的宽度和高度。让 I_w 和 I_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]];

【讨论】:

我如何在 Storyboard 中做到这一点? @RodrigoRuiz 您将无法在 Interface Builder(也称为 Storyboard)中创建适当的约束。我在答案中添加了一条说明。 9.0之前的iOS版本代码有错误。 MAX_HEIGHT 和 MAX_WIDTH 必须交换。

以上是关于具有自动布局和最大尺寸保持纵横比的 UIImageView的主要内容,如果未能解决你的问题,请参考以下文章

通过保持纵横比和宽度调整 UIImage 的大小

如何设置 img 的最小和最大尺寸并保持纵横比? [复制]

在 CSS FlexBox 布局中自动调整图像大小并保持纵横比?

布局约束将图像大小调整为屏幕宽度保持纵横比

使图像适应容器大小保持纵横比

如何在保持纵横比和大小的同时合并两个 UIImage?