ios 使用自动布局的动态高度UIStackView的问题

tvmytwxo  于 2023-06-25  发布在  iOS
关注(0)|答案(1)|浏览(342)

我试图创建一个水平轴UIStackView,有两个视图,一个标签和一个图像,看起来像这样:

  • 蓝色是标签
  • 形象就是形象
  • UIStackView的帧是绿色部分+蓝色部分+图像

我想要达到的是
我想达到的目标:

  • 文本需要与stackview底部对齐
  • 文本可以是1行或更多行
  • 可能有一个图像,在这种情况下,它的尺寸将固定在120x120
  • 如果标签超出图像的高度,图像将保持底部对齐
  • 可能存在也可能不存在图像,在这种情况下,标签应该采用stackview的全宽度
  • UIStackView需要动态增长,具体取决于标签和图像哪个更高

这是我在故事板中的设置:

限制如下:

我正在努力解决的边缘情况是,当我有一个相当长的文本需要 Package 时,它会缩小图像,看起来像这样:

我知道解决这个问题的一种方法是将图像约束从lessThanEqual更改为Equal,但是当我这样做时,当图像为nil时,分配给imageview的空间不会被删除,并防止标签占用堆栈视图的整个宽度

我怎么能以这样一种方式创建约束
1.当有图像时,确保图像为128x128
1.当图像存在时,标签不会缩小图像
1.如果将图像设置为nil,则标签可以采用stackview的全宽度

ubbxdtey

ubbxdtey1#

好吧,相当长的帖子……
实际上,我不确定你是否可以只在约束的帮助下实现这一点,但也许你可以这样做:

final class CustomImageView: UIImageView {
  
  override var image: UIImage? {
    didSet {
      isHidden = image == nil
    }
  }
  
}

所以当你设置一个图像,ex。从url,并将发生image为nil,imageView将隐藏自身,标签将采用StackView的完整大小。或者,您可以避免为imageView创建自定义类,而只需在本地添加该逻辑即可。此外,如果您需要图像始终为128x128,并且不将大小调整为更小的标签尺寸(如1、2或3行高度),则可以使用strong equal约束,而不是lessThanOrEqualtype。

编辑:

如果更改不适用于堆栈视图布局,您还可以用途:

customImageView.image = UIImage(systemName: "plus")
stackView.layoutIfNeeded()

customImageView.image = UIImage(systemName: "plus")
stackView.superview?.layoutIfNeeded()

抱歉,忘了提这个。

相关问题