没有图像的自动布局 UIImageView

Posted

技术标签:

【中文标题】没有图像的自动布局 UIImageView【英文标题】:Autolayout UIImageView without image 【发布时间】:2014-03-07 14:15:49 【问题描述】:

我有一个 UIImageView,带有缩放中心,所以它的大小会根据里面的 UIImage 而变化,但是,通过设置 nil UIImage,约束会中断,因为无法计算内容大小

如何处理 nil UIImage 的自动布局(大小应改为 0,0)?

【问题讨论】:

【参考方案1】:

问题是UIImageView 在没有设置图像时返回 -1, -1 作为 intrinsicContentSize。使用UIImageView 的子类,实现如下:

@implementation MyImageView

- (CGSize)intrinsicContentSize

    if (self.image)
    
        return [super intrinsicContentSize];
    

    return CGSizeZero;


@end

【讨论】:

非常有帮助,谢谢。一个小补充:您可能还想检查图像的大小是否为零,在这种情况下,还返回 CGSizeZero,默认为 -1, -1。【参考方案2】:

@nikita-ivaniushchenko's answer 让我想到了将Low (250) 优先级等于0Width 约束添加到UIImageView,因此当UIImage 设置为nil 时应用它。

注意:我只添加了Width 约束,因为在我的情况下UIImageView 的宽度存在问题。不过,两者都应该适用。

【讨论】:

为什么它应该起作用?我今晚会尝试,但我很好奇答案背后的原因 我不确定,但是,我怀疑intrinsicContentSize 只是一些内部约束,为方便我们自动创建。当我们添加高度/宽度约束时,intrinsicContentSize 的约束要么被删除,要么具有较低的优先级。 @yitschak 值得注意的是,我的假设基于this answer 它对我有用,只是不是 250 而是 500(或 750)。不知道为什么。 它也适用于宽度 = 0,优先级 > 250 的我。我猜 intrinsicContentSize 的优先级最低,将优先级设置为 250(最低)让 intrinsicContentSize 接管。因此,将优先级设置为 > 250 只会有所帮助。顺便说一句,感谢您提供这个很棒的提示!【参考方案3】:

Content hugging priority 设置为Required (1000)。

更新:此答案以前有效,但现在无效。 改用 Nikita Ivaniushchenko 回答。

【讨论】:

刚刚在 ios 8 上再次检查。当 UIImageView 设置了 nil 图像时,它不会将其大小更改为 0,0。考虑你有这样的东西:|-[imageView]-[label]-| 当没有图像集时,UIImageView 大小将扩展到最大可用空间,无论你为Content hugging priority 设置什么值。这是因为当UIImageView 中没有设置图像时,其intrinsicContentSize 默认为-1,-1。 @Nikita Ivaniushchenko 的答案是正确的解决方案。 @Darrarski 我创建了测试项目,我应该说你是对的——目前它不起作用。我不知道为什么 Apple 最近改变了这种行为。

以上是关于没有图像的自动布局 UIImageView的主要内容,如果未能解决你的问题,请参考以下文章

使用自动布局时 UIImageView 没有动画

自动布局是拉伸图像,自动布局,ios

UIImageView 高度不是自动布局约束后子图像高度的高度。

图像为零时具有固定尺寸 UIImageView 的自动布局?

自动布局:UIImageView 不随设备方向旋转

自动布局,异步加载图像到 uiimageview (Swift, xCode6)