内容拥抱和内容压缩阻力、自动布局约束的问题
Posted
技术标签:
【中文标题】内容拥抱和内容压缩阻力、自动布局约束的问题【英文标题】:An issue with Content Hugging and Content Compression Resistance, Autolayout Constraints 【发布时间】:2015-03-28 01:54:00 【问题描述】:我已将问题修改为提供更多信息且更清晰。
我想要一个动态表格视图单元格,具有灵活高度的 UITextView 和可选的 UIImageView。根据 UITextView 和可选 UIImageView 的内容大小,可以缩小或扩展单元格。
这是我所期望的(下图):
正常大小:TextView 的高度是固定的(比如 77)。 ImageView 的宽度和高度也是固定的(比如 130、130) TextView 内容大小减小时,单元格缩小,ImageView 向上移动。 ImageView 中没有图片时,ImageView 不显示,单元格缩小。以下是视图的结构:
mainView 是 contentView 的子视图 topView、textView、bigImageView、bottomView是mainView的子视图但是,我实际得到的如下。
左图:如果内容过大,则看不到ImageView。 右图:如果内容大小为一行,可以看到ImageView,但是它的宽高不是固定的130、130警告问题如下:
如果我通过选择“添加缺少的约束”来修复它,我得到的结果如下:
右图显示TextView的高度不再灵活。TextView 的约束、Content Hugging Priority、Content Compression Resistance 和 Intrinsic Size:
我没有为这个 TextView 使用 Intrinsic sizeImageView 的约束、Content Hugging Priority、Content Compression Resistance 和 Intrinsic Size:
我为这个 ImageView 使用了 Intrinsic size我一直在为 TextView 和 ImageView 使用 Hugging Priority 和 Compression Resistance Priority 但没有运气。结果都不是我预期的。
请帮忙指出设置中有什么问题以及如何实现我的目标。
【问题讨论】:
您是否在控制台中收到任何关于不满足约束的错误?只要您固定图像宽度/高度并且图像底部固定到外部视图并且顶部固定到文本区域,这种布局应该没问题。如果蓝色区域是 contentView 内部的一个视图,它也需要固定到 contentView 的底部。最好在预览面板中查看它,看看它会如何出现在屏幕上。您的图像似乎来自故事板? 谢谢罗里。我急着问这个问题,但现在我认为我的问题的信息不是那么清晰和混乱。我现在修改一下。 在 IB 中设置“固有大小”在运行时不会产生任何影响。这只是一种通知 IB 视图在运行时将具有固有大小的方法,这样它就不会在设计时抱怨或做错事。如果你告诉 IB 关于运行时间的内容是错误的,那么你会得到错误的结果。换句话说,您几乎不应该更改该设置。如果您希望图像视图始终根据其显示的图像调整大小,请将其拥抱和压缩阻力优先级设置为 1000。对于文本视图也是如此。尽可能避免设置明确的尺寸限制。 我把'intrinsic size'改回默认值,并将它们的拥抱和抗压优先级设置为1000,但仍然是错误的。我有什么遗漏吗? 您现在遇到的具体错误是什么? 【参考方案1】:这里的棘手部分似乎是,当有图像时,您希望它是 130x130,但当没有图像时,您希望将其隐藏。
我的建议是为
这将允许图像视图在没有图像时缩小到 0x0。
当有图像时,它会缩放到图像大小,但保持正方形。它永远不会大于 130x130。不是你想要的,但很接近。
我认为你不必担心拥抱和压迫。
我认为要完全按照您的意愿行事需要代码。您需要为高度和宽度约束创建 IBOutlets,但这次使它们 =130。在您的代码中,当您将图像设置到图像视图中时,将代码中的约束常量设置为 130 或 0。我认为这是实现您所要求的唯一方法。为此,您可以 CTRL 从您的宽度和高度约束拖动到控制器的 .h 中并创建 IBOutlets。这就是我处理需要根据单元格数据模型的状态做出决定的约束的方式。
【讨论】:
ImageView Height & width 很高兴它成功了。由于分辨率的不同,您会注意到我认为在不同手机类型上的差异。对于视网膜,您需要至少 260x260 像素的图像以将其强制为 130x130 点。在 iPhone 6+ 上,您需要 390x390 像素。处理这个问题的唯一方法是设置点 x 点的 IBOutlet 方法。以上是关于内容拥抱和内容压缩阻力、自动布局约束的问题的主要内容,如果未能解决你的问题,请参考以下文章
自定义 UITableViewCell 中标签的自动布局优先级