首页 > 解决方案 > 水平 UIStackView :值 999 或 1000 在水平内容压缩阻力中是否有任何特殊含义?

问题描述

我在水平堆栈视图中有以下 3 个组件。

  1. 黄色的UILabel
  2. 红色的UIImageView
  3. 绿UIImageView

水平堆栈视图的分布是Fill

的内容模式UIImageViewAspect fit。他们使用名为“pin.fill”的 SFSymbol。

for的行数UILabel为0,因此它支持多行。

所有 3 个组件都具有相同的内容拥抱优先级 (250) 和内容压缩阻力优先级 (750)

当 UILabel 的水平内容抗压强度为 750 到 998 时

在此处输入图像描述

在此处输入图像描述


我的问题是

  1. 为什么红色UIImage占用大部分空间,即使它们都具有相同的内容拥抱优先级 (250) 和内容压缩阻力优先级 (750)
  2. 我的意图是让黄色UILabel填满大部分空间。但是,我只能做到这一点,如果我将水平内容压缩阻力UILabel仅限)提高到 999 或 1000。我想,只要任何值高于 750 就足够了?水平抗压强度中的999或1000值有什么特殊含义吗?

当 UILabel 的水平内容抗压强度为 999 或 1000 时

在此处输入图像描述

请注意,即使 UILabel 的水平内容压缩阻力为 999 或 1000,red 和 greenUIImageView的宽度都会被压缩。但是,它们以不同的强度压缩,最终 2UIImageView的宽度略有不同。为什么?


p/s

完整的项目代码位于https://github.com/yccheok/stackoverflow/tree/master/66444344/test

标签: iosswift

解决方案


你有点想多了。

您要做的是告诉两个图像视图“拥抱”它们的内容,并将其他所有内容保留为默认的拥抱和压缩阻力值。

所以,标签属性:

在此处输入图像描述

两个“pin”图像视图:

在此处输入图像描述

它在您的 Storyboard 中将如下所示:

在此处输入图像描述

试试这个代码......将标签连接到@IBOutlet并运行应用程序。每次点击都会循环播放标签的 4 个不同长度的字符串:

class ViewController: UIViewController {
    
    @IBOutlet var label: UILabel!
    
    let strs: [String] = [
        "Very Short",
        "A little longer, but still one line.",
        "Button - You can set the title, image, and other appearance properties of a button.",
        "UIStackView - creates and manages the constraints necessary to create horizontal or vertical stacks of views. It will dynamically add and remove its constraints to react to views being removed or added to its stack. With customization it can also react and influence the layout around it.",
    ]
    
    var idx: Int = 0
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        label.text = strs[idx % strs.count]
        
        // tap anywhere in the view
        let t = UITapGestureRecognizer(target: self, action: #selector(gotTap(_:)))
        view.addGestureRecognizer(t)
        
    }
    
    @objc func gotTap(_ g: UITapGestureRecognizer) -> Void {
        idx += 1
        label.text = strs[idx % strs.count]
    }
    
}

结果将是:

在此处输入图像描述

在此处输入图像描述

在此处输入图像描述

在此处输入图像描述


推荐阅读