防止垂直 UIStackView 拉伸子视图?

bmt*_*033 3 uiimageview ios autolayout uistackview

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

在此处输入图片说明

标签应该左对齐并在堆栈视图的宽度上拉伸(确实如此)。图像视图具有纵横匹配的内容模式,应该在堆栈视图的中间居中。我认为这是按照我想要的方式工作,直到我在 UIImageView 上设置背景颜色,然后意识到虽然图像本身看起来是正确的(缩放和居中),但视图本身延伸到 stackview 的整个宽度(就像标签一样)做)。

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

rob*_*off 9

进行这些更改:

  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
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

请注意,由于单元格可以重复使用,因此您还必须删除先前的纵横比约束(如果有)。我发布的代码imageViewAspectConstraint用于保存约束并在图像更改时将其删除。