水平 UIStackView :值 999 或 1000 在水平内容压缩阻力中是不是有任何特殊含义?

Posted

技术标签:

【中文标题】水平 UIStackView :值 999 或 1000 在水平内容压缩阻力中是不是有任何特殊含义?【英文标题】:Horizontal UIStackView : Does value 999 or 1000 carry any special meaning in Horizontal Content Compression Resistance?水平 UIStackView :值 999 或 1000 在水平内容压缩阻力中是否有任何特殊含义? 【发布时间】:2021-03-02 17:36:06 【问题描述】:

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

    黄色UILabel 红色UIImageView 绿色UIImageView

Horizo​​ntal stack view 的分布是Fill

UIImageView 的内容模式是Aspect fit。他们正在使用名为“pin.fill”的 SFSymbol。

UILabel的行数为0,所以支持多行。

所有 3 个组件都具有相同的 Content Hugging Priority (250) 和 Content Compression Resistance Priority (750)

当 UILabel 的水平内容压缩阻力为 750 到 998 时


我的问题是

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

当 UILabel 的水平内容压缩阻力为 999 或 1000 时

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


p/s

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

【问题讨论】:

您是否为图像视图设置了宽度和/或高度限制?他们使用什么内容模式 - 方面填充?实际的图钉图片大小是多少? UIImageView 的内容模式是Aspect fit @DonMag 我还发布了一个完整的项目代码供您参考。谢谢。 【参考方案1】:

你有点想多了。

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

所以,标签属性:

两个“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]
    
    

结果将是:

【讨论】:

谢谢。但是,为什么我们必须在每个 UIImageView 的“内容拥抱优先级”上放置 1000?为什么像 300 这样相对较高的值不起作用? 1000有特殊含义吗? @CheokYanCheng - 1000 的优先级意味着必需。虽然其他值可能有效(快速实验似乎表明 >=760),但没有真正的理由将其设置为必需,因为这是我们想要的结果。作为旁注,我认为开发人员定义元素大小(使用约束或其他相关方法)更为常见,尤其是图像视图。

以上是关于水平 UIStackView :值 999 或 1000 在水平内容压缩阻力中是不是有任何特殊含义?的主要内容,如果未能解决你的问题,请参考以下文章

如何在水平 UIStackView 中对齐两个标签的底部?

UISlider 在水平 UIStackView 中的高度

UIStackView

水平 UIStackView 拉伸子视图

当其他元素太宽时,在水平 UIStackview 中看不到标签

Python:替换数组中的 NaN 或 MEAN 而不是 -999 值[重复]