【问题标题】:Setting UIImageView image affects layout constraints设置 UIImageView 图像会影响布局约束
【发布时间】:2017-10-10 20:44:44
【问题描述】:

我正在创建一个具有以下约束的简单 UIImageView:

self.view.addConstraint(imageView.topAnchor.constraint(equalTo: contentLayoutGuide.topAnchor))
self.view.addConstraint(imageView.centerXAnchor.constraint(equalTo: contentLayoutGuide.centerXAnchor))
self.view.addConstraint(imageView.heightAnchor.constraint(equalTo: contentLayoutGuide.heightAnchor))
self.view.addConstraint(imageView.widthAnchor.constraint(equalTo: contentLayoutGuide.heightAnchor))

重要的是最后一个,它设置宽度等于图像视图的高度,图像视图的高度由顶部和底部锚点定义。

现在看起来非常好(见下图)

但是,当设置imageView.image 时,图像会遍布屏幕并且太大了。 这个调试过程修复了它:

po for cn in self.imageView!.constraints { cn.isActive = false }
po CATransaction.flush()

这使图像按预期放入 imageView 中,但直到此时,imageView 都搞砸了。

有趣的是,在设置图像之前,imageView 本身没有任何约束,然后设置图像会创建这两个:

- 0 : <NSContentSizeLayoutConstraint:0x6040002b2120 UIImageView:0x7fa98f757b90.width == 488 Hug:250 CompressionResistance:750   (active)>
- 1 : <NSContentSizeLayoutConstraint:0x6040002b2180 UIImageView:0x7fa98f757b90.height == 487 Hug:250 CompressionResistance:750   (active)>

这些限制似乎打破了它,因为禁用它们可以解决问题。它们仅在设置图像时添加

【问题讨论】:

  • 您是否在imageView 上将translatesAutoresizingMaskIntoConstraints 设置为false
  • 是的,当然。否则默认情况下约束会中断
  • 您是否将图像视图的内容模式设置为宽高比适合?

标签: ios swift uiimageview


【解决方案1】:

尝试降低内容压缩/拥抱。我认为(如果我错了,请纠正我)默认情况下,UIImageView 比 UIView(251 到 250)具有更高的压缩/拥抱阻力。你可以试试下面的代码:

someImage.setContentHuggingPriority(UILayoutPriority(rawValue: 249), for: .horizontal)
someImage.setContentCompressionResistancePriority(UILayoutPriority(rawValue: 249), for: .horizontal)
someImage.setContentHuggingPriority(UILayoutPriority(rawValue: 249), for: .vertical)
someImage.setContentCompressionResistancePriority(UILayoutPriority(rawValue: 249), for: .vertical)

【讨论】:

  • 使用 .defaultLow (250) 也可以,默认情况下它似乎是 .defaultHigh,它 (750) 会导致此错误
  • 图像没有 setContentHuggingPriority 和 setContentHuggingPriority。 ImageView 可以。我有同样的问题,但在我的情况下,解决方案不起作用。
【解决方案2】:

尝试将 UIImageView 的 clipsToBounds 属性设置为 true 并检查,因为对于少数 contentMode 选项,如果边界不足以填充内容,图像就会超出图像视图的边界。

【讨论】:

    【解决方案3】:

    您的UIImageView 是否屏蔽了边界?如果图像大于UIImageView,则默认情况下它将超出边界

    imageView.layer.masksToBounds = true
    

    您是否尝试过将UIImageView 的内容匹配更改为例如Aspect Fit?

    【讨论】:

    • 就我而言,这行得通。我有一个带有自动布局约束的 tableviewcell 视图,其中 UIImageView 放置在左侧,并并排放置在 UILabels 的右侧。但不知何故,我的 UILabel 与 UIImageView 重叠了一些奇怪的边缘。这个解决方法解决了我的问题。
    猜你喜欢
    • 1970-01-01
    • 2017-11-05
    • 2018-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-23
    • 1970-01-01
    相关资源
    最近更新 更多