setContentHuggingPriority和setContentCompressionResistancePriority的使用

文章讲述了在iOS开发中,如何通过设置UILabel的contentCompressionResistancePriority和contentHuggingPriority属性,来处理两个并排显示的label在屏幕宽度不足或过剩时的显示效果。当空间不足时,降低左侧label的抗压缩优先级,使得它优先被压缩;当空间足够时,调整拉伸优先级,控制label在额外空间下的扩展行为。
摘要由CSDN通过智能技术生成

需求:

两个label并排显示,文字内容由服务器返回,label宽度以文字内容自适应,label之间间距大于等于10.

  需要考虑以下情况:

  • 当两个label的宽度和 < 屏幕宽度时,各自设置约束,无需处理,都可以完全展示。
  • 当两个label宽度和 > 屏幕宽度时,让左label压缩,优先让右label文字完全显示。

为了实现需求,我们可以使用下面2个api

这2个api是UIView的方法,在使用约束布局时生效。

//设置控件的拉伸优先级
//控件的拉伸优先级数值默认是250,数值越大,越不易被拉伸
- (void)setContentHuggingPriority:(UILayoutPriority)priority forAxis:(UILayoutConstraintAxis)axis;

//设置控件的抗压缩优先级
//控件的抗压缩优先级数值默认是750,数值越大,越不易被压缩。
- (void)setContentCompressionResistancePriority:(UILayoutPriority)priority forAxis:(UILayoutConstraintAxis)axis;

setContentCompressionResistancePriority(抗压缩),

  • 这个值越低,会在宽度不够的情况下,优先被压缩。
  • 这个值越大,会在宽度不够的情况下,优先完全展示。

常见的视图默认给的值是UILayoutPriorityDefaultHigh = 750。

举例:一个labelA的抗压缩系数为500,labelB为750,那么空间不足的情况下,LabelA会打点显示。

上面的例子中,我们设置左边的label抗压缩为500(小于右侧label即可),即可达到效果。

先看默认情况,设置为750,xib会有报错,并且run效果和xib效果不一致:

 改成749(只要小于右侧的抗压缩系数即可) ,左侧label优先被挤压,run效果和xib效果一致,就不贴图了:

在试试设置为751,左侧label扬眉吐气,完全展示,右侧label被挤压:


在看看另一个API的作用 

setContentHuggingPriority(拉伸),

  • 这个值越小,就会在宽度多余的情况下,被拉伸。
  • 这个值越大,就会在宽度多余的情况下,优先保持原尺寸。

默认情况下: HuggingPriority == 250

举例:一个labelA的拉伸系数为250,labelB为500,那么空间充足的情况下,LabelA会显示更多。

看代码前,先把label之间间距大于等于10 改为 等于10,这样才会出现父视图宽度 大于 子视图宽度和的情况。

先看默认情况,都设置为250,xib会有报错,并且run效果和xib效果不一致:

在看把左侧label拉伸系数改为100, 左侧填满的父视图剩余空间

左侧label的拉伸系数改为500,左侧内容宽度不变,右侧内容填满父视图空间

 总结一下:

在宽度不够的情况下:

setContentCompressionResistancePriority(抗压缩)生效

  • 这个值越小,优先被压缩。
  • 这个值越大,优先完全展示。

在宽度足够的情况下:

setContentHuggingPriority(拉伸)生效

  • 这个值越小,优先被拉伸。
  • 这个值越大,优先保持原尺寸,拉伸其他视图。

在空间足够或者不足时,值越小,越会被压缩,拉伸。

在空间足够或者不足时,值越大,越会保持原有尺寸。

### 回答1: 在UIStackView中分配比例可以使用分布属性(distribution property)。分布属性可以在Storyboard或通过编程方式进行设置。以下是一些示例: 1. 在Storyboard中分配比例: - 选择您的UIStackView。 - 在属性检查器中,找到“Distribution”选项,并将其更改为“Fill Equally”(平均分配)或“Fill Proportionally”(按比例分配)。 - 如果您选择“Fill Proportionally”,则可以通过更改每个子视图的“Proportion”属性来设置每个子视图的比例。 2. 通过编程方式分配比例: - 在代码中,使用以下代码访问您的UIStackView的分布属性: ``` stackView.distribution = .fillEqually // 平均分配 stackView.distribution = .fillProportionally // 按比例分配 ``` - 如果您选择“Fill Proportionally”,则可以使用以下代码设置每个子视图的比例: ``` subview1.setContentHuggingPriority(UILayoutPriority(249), for: .horizontal) subview1.setContentCompressionResistancePriority(UILayoutPriority(749), for: .horizontal) subview2.setContentHuggingPriority(UILayoutPriority(249), for: .horizontal) subview2.setContentCompressionResistancePriority(UILayoutPriority(749), for: .horizontal) // 其他子视图的比例设置 ``` - setContentHuggingPriority(_:for :)和setContentCompressionResistancePriority(_:for :)方法分别设置子视图的拉伸优先级和压缩优先级。根据这些优先级和UIStackView的大小,系统将计算每个子视图的大小和位置。 ### 回答2: UIStackView是iOS开发中非常常用的一种容器视图,它可以帮助我们快速搭建界面,并且自动进行内部子视图的布局管理。 在UIStackView中分配子视图的比例显示是非常简单的,我们可以通过设置子视图的布局属性来实现。 首先,我们需要将UIStackView的distribution属性设置为.fillEqually,这样会将子视图平均分配到UIStackView中。 接下来,我们可以通过设置子视图的占比来实现比例显示。UIStackView提供了一个子视图的属性arrangedSubviews,我们可以通过该属性获取到UIStackView内部的子视图数组。 我们可以通过索引访问数组中的子视图,并设置子视图的布局属性,比如widthAnchor或heightAnchor来实现分配的比例显示。 例如,如果我们有三个子视图,我们可以设置第一个子视图的widthAnchor为其他两个子视图的一半,第二个子视图的widthAnchor为其他两个子视图的四分之一,最后一个子视图的widthAnchor为其他两个子视图的四分之一。 代码示例如下: ``` let stackView = UIStackView() stackView.distribution = .fillEqually let subview1 = UIView() stackView.addArrangedSubview(subview1) subview1.widthAnchor.constraint(equalTo: stackView.widthAnchor, multiplier: 0.5).isActive = true let subview2 = UIView() stackView.addArrangedSubview(subview2) subview2.widthAnchor.constraint(equalTo: stackView.widthAnchor, multiplier: 0.25).isActive = true let subview3 = UIView() stackView.addArrangedSubview(subview3) subview3.widthAnchor.constraint(equalTo: stackView.widthAnchor, multiplier: 0.25).isActive = true ``` 通过以上设置,我们可以实现UIStackView中子视图按照一定的比例显示的效果。 ### 回答3: UIStackView是iOS开发中的一个布局容器,可以用来水平或垂直地排列一组视图。通过设置UIStackView的distribution属性,可以控制其中视图的分布比例。 UIStackView的distribution属性有四种可选值: 1. Fill:视图被拉伸到填满整个UIStackView,不保持原始尺寸比例。 2. Fill Equally:视图被平均拉伸到填满整个UIStackView,并保持原始尺寸比例。 3. Fill Proportionally:视图根据其原始尺寸比例进行拉伸,以填满整个UIStackView。 4. Equal Spacing:视图之间的间距保持相等,视图尺寸根据自身内容决定。 如果想要实现分比例显示,可以通过设置UIStackView中视图的布局约束来控制。可以使用视图的宽度或高度约束,设置其优先级为低,然后在UIStackView的distribution属性中选择Fill Proportionally或Equal Spacing。这样,视图将会根据其原始尺寸比例进行拉伸或保持等间距分布。 例如,如果有两个视图A和B,希望A的宽度是B的宽度的2倍。可以设置A的宽度约束为等于B的宽度的2倍,并将约束的优先级设置为低。然后,在UIStackView的distribution属性中选择Fill Proportionally,这样A和B的宽度将会按照2:1的比例来显示。 可以根据具体的需求,使用布局约束和UIStackView的distribution属性来实现不同比例的视图显示。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值