防止垂直UIStackView拉伸子视图?

时间:2018-10-04 15:17:03

标签: ios uiimageview autolayout uistackview

我有一个带有垂直UIStackView的UITableViewCell,当前具有.alignment =填充和distribution =填充。在堆栈视图中,我有一个UILabel和一个UIImageView。

PEP498

标签应保持对齐并在stackview的宽度上延伸(确实如此)。图像视图具有宽高比适合的内容模式,应位于堆栈视图的中间。我以为这是我想要的,直到我在UIImageView上设置了背景色,然后才意识到,尽管图像本身看起来正确(缩放并居中),但视图本身却在整个stackview的整个宽度上延伸(就像标签一样)确实)。

是否可以使标签延伸堆栈视图的宽度,而不延伸图像视图的宽度?理想情况下,我希望图像视图只是缩放图像的大小,并且一直延伸到堆栈视图的边缘。

2 个答案:

答案 0 :(得分:1)

一种方法:

  • 为您的图像计算合适的宽高比框架

当用户在图像视图上轻按时,请评估轻按位置,并且只有在轻按位于高宽适合框内时才采取措施。


另一种方法:

  • 为您的图像计算合适的宽高比框架
  • UIImageView嵌入水平居中的UILayoutGuide
  • UILayoutGuide添加为堆栈视图的排列子视图

这将使您的标签在堆栈视图(单元格)的整个宽度上伸展并使图像视图居中,从而使您可以检测到点击。

答案 1 :(得分:1)

进行以下更改:

  1. 将堆栈视图的对齐方式设置为.center,而不是.fill
  2. 将标签的宽度限制为等于堆栈视图的宽度。
  3. 在代码中,当您设置图像视图的图像时,还要在图像视图上创建长宽比约束,如下所示:

    class MyCell: UITableViewCell {
        @IBOutlet private var myImageView: UIImageView!
        private var imageViewAspectConstraint: NSLayoutConstraint?
    
        func setImage(_ image: UIImage) {
            myImageView.image = image
    
            imageViewAspectConstraint?.isActive = false
            imageViewAspectConstraint = myImageView.widthAnchor.constraint(
                equalTo: myImageView.heightAnchor,
                multiplier: image.size.width / image.size.height)
            imageViewAspectConstraint!.isActive = true
        }
    }
    

请注意,由于可以重用单元格,因此如果存在单元格比例约束,则还必须删除它。我发布的代码使用imageViewAspectConstraint保存约束,并在图像更改时将其删除。