【问题标题】:How to combine Auto Layout constraints with contentMode property of UIView如何将自动布局约束与 UIView 的 contentMode 属性结合起来
【发布时间】: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(下方星号框),圆角不再可见:

--------------------------
|       **********       |
|       *        *       |
|       *        *       |
|       *        *       |
|       **********       |
--------------------------

有没有办法防止这种行为?

【问题讨论】:

    标签: ios autolayout cornerradius 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 中设置圆角半径。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-14
      • 2013-05-14
      • 1970-01-01
      相关资源
      最近更新 更多