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之前的版本。必须交换最大高度和最大宽度。