UIStackView 的 distribution 属性详解

本文详细介绍了iOS9中UIStackView的使用方法及其主要属性,包括axis、alignment、distribution和spacing。尤其针对distribution属性的不同选项进行了深入解析,并通过实例说明了如何根据不同场景选择合适的属性值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

iOS9 提供的 UIStackView 简化了布局操作,它有些像 Android 中的 liner layout。以前不用 UIStackView 也是可以做出类似的效果的,不过要添加许多的约束,看得头都大了,使用了 UIStackView 后,约束得到了简化。

UIStackView 中主要有 axis、alignment、distribution、spacing 四个属性,不太好理解的就是 distribution 这个属性,它的值如下:

typedef NS_ENUM(NSInteger, UIStackViewDistribution) {
    UIStackViewDistributionFill = 0,

    UIStackViewDistributionFillEqually,

    UIStackViewDistributionFillProportionally,

    UIStackViewDistributionEqualSpacing,

    UIStackViewDistributionEqualCentering,
} NS_ENUM_AVAILABLE_IOS(9_0);

需要注意的是,UIStackView 内部也是通过约束来实现的,因此,必须提供足够的且正确的约束才能使用好它。

1. UIStackViewDistributionFill

Fill,就是填满了。这里分2种情况。

  • 情况1,stackview 的大小是固定的

    这里写图片描述
    如图,stackview 的大小被固定了,那么它包含的 4 个子视图就一定会充满整个 stackview,怎么分配这 4 个子视图的大小呢?这就需要我们提供 constraint 来实现了。如果我们提供的 contraint 不对,就会产生问题。这里建议加入 3 个 view 的高度 contraint,并且这 3 个高度之和要小于实际 stackview 的高度,这样,stackview 就能通过调整第四个 view 达到 fill 的效果。
    这里写图片描述

  • 情况2,stackview 的大小没有进行限制。

在垂直布局的情况下,如果不对 stackview 的高度进行约束,如图,
这里写图片描述
我们删除了 stackview 的底部约束。这样,只要我们提供了详细的 4 个子 view 的高度约束,stackview 就会自动调整高度,包裹住内容,很像 android 中的线性布局。
看看效果
这里写图片描述

2. UIStackViewDistributionFillEqually

这个比较好理解,就是会自动调整高度,使它们高度一致。
也是存在 2 种情况,当 stackview 的高度有约束时,我们就不需要对子 view 添加高度约束了,系统会为我们做好。

当 stackview 的高度没约束时,我们就必须提供某个子 view 的高度约束,让系统好计算出剩下子 view 的高度和 stackview 的高度。

3. UIStackViewDistributionFillProportionally

按照原比例缩放。原比例哪里来?官方文档说,来自 intrinsic size,我感觉比较简单的方法还是自己添加约束。

这个属性,一般是 stackview 的高度有约束,而 4 个 subview 的高度也有约束,注意 subview 的高度约束的 priority 要低于 1000。stackview 可以根据 subview 的约束,计算出比例,进行缩放。
这里写图片描述

这里写图片描述

4. UIStackViewDistributionEqualSpacing & UIStackViewDistributionEqualCentering

这 2 个选项也是应用于 stackview 高度确定,subview 的高度也确定,想让 subview 比较均匀地分布在 stckview 中。均匀分布的方法不同,所以有 2 个选项。

另外,stackview 的一个特点是,当把其中的一个子 view 去掉后,布局会重新渲染,就如同 android 布局中的 gone 选项,十分好用!省去了以前大把大把的代码。那么这个所谓的去掉是什么操作呢?一般来说,是设置子 view 的 hidden = true,并且调用 stackview 的函数,removeArrangedSubview。在当前 iOS 版本,如果仅仅设置 hidden 属性,在有些时候,无法对剩下的子 view 进行自动布局。当需要重新显示的时候,设置 hidden 属性,并调用 insertArrangedSubview: atIndex:方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值