如何将自动布局约束与 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

在我设置关联的CALayercornerRadius 值之前,我认为一切正常:

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 上的自动布局约束引起的大小变化做出反应?

将子类 UIView 添加到具有自动布局约束的 Nib

如何使用自动布局在 Swift 中为可重用的 UIView 设置约束?

Swift UIView 自动布局和约束

UIView 不遵守 UIScrollView 中的自动布局约束

在自定义 UIView 类 Iphone 上应用自动布局约束。