如何将自动布局约束与 UIView 的 contentMode 属性结合起来
Posted
技术标签:
【中文标题】如何将自动布局约束与 UIView 的 contentMode 属性结合起来【英文标题】:How to combine Auto Layout constraints with contentMode property of UIView 【发布时间】:2013-09-22 17:21:24 【问题描述】:我有一个配置了自动布局的UIImageView
对象。我创建了约束,以便视图与其父视图保持恒定距离。在视觉格式中,它会是这样的:
@"V:|-[imageView]-|"
@"H:|-[imageView]-|"
但我也想保持底层图像的纵横比,所以我将UIViewContentModeScaleAspectFit
分配给contentMode
。
在我设置关联的CALayer
的cornerRadius
值之前,我认为一切正常:
self.imageView.layer.cornerRadius = 7;
self.imageView.layer.maskToBounds = YES;
现在当图像视图调整大小时,例如由于方向的变化,圆角会根据视图获得的新大小而丢失。原因是cornerRadius
适用于UIImageView
(下方虚线框),但由于基础图像的大小也已调整为尊重contentMode
(下方星号框),圆角不再可见:
--------------------------
| ********** |
| * * |
| * * |
| * * |
| ********** |
--------------------------
有没有办法防止这种行为?
【问题讨论】:
【参考方案1】:就像@jacob-k 所说,你应该添加到你的单元子类 layoutSubviews
,但只是添加你应该先调用layoutIfNeeded
。
例子:
- (void)layoutSubviews
[super layoutSubviews];
[self layoutIfNeeded];
imageView.layer.cornerRadius = imageView.frame.size.width / 2;
如果您不先调用layoutIfNeeded
,那么它会应用所有更改而不受您设置的限制。
【讨论】:
谢谢你..像魅力一样工作。挣扎了这么久。 这仅适用于 UITableViewCell,前提是您将约束附加到 tableview 单元格而不是 contentView。 (视图仍然可以添加到 contentView 如果您对 uitableviewcell 中的所有尺寸类别都有复杂的约束,这就是解决方案 如何将这种方法与影响视图大小的约束动画结合起来?【参考方案2】:一种快速的方法是继承 UIImageView 并在layoutSubviews
中设置圆角半径。
【讨论】:
以上是关于如何将自动布局约束与 UIView 的 contentMode 属性结合起来的主要内容,如果未能解决你的问题,请参考以下文章
如何对 UIView 上的自动布局约束引起的大小变化做出反应?
如何使用自动布局在 Swift 中为可重用的 UIView 设置约束?