17、UIStackView的用法

1、基本介绍

1.1 什么是StackView

  • UIStackView 是 UIView 的子类,它不能用来呈现自身的内容,而是用来约束子控件的一个控件。
  • UIStackView 提供了一个高效的接口用于平铺一行或一列的视图组合。对于嵌入到 StackView 的视图,我们不用再添加自动布局的约束了。Stack View 会管理这些子视图的布局,并帮我们自动布局约束。也就是说,这些子视图能够适应不同的屏幕尺寸。
  • UIStackView 支持嵌套,我们可以将一个 Stack View 嵌套到另一个 Stack View 中,从而实现更为复杂的用户界面。
  • 使用 UIStackView 并不意味这不需要处理自动布局了。我们仍旧要定义一些布局约束来约束 Stack View。它只是帮我们节约了为每个 UI 元素创建约束的时间,同时它更容易的从布局中添加/删除一个视图。
  • UIStackView 和传统容器类另一个区别是他自己虽然继承自 UIView,但它本身不能自我渲染,比如他的 backgroundColor 是无效的,所以它注定要和 UIView 相辅相成的进行工作。它能够帮助 UIView 来处理 子View 的位置和大小等布局问题。

StackView最低支持是iOS9.0,如果想要在在iOS8.0使用,可以使用https://github.com/forkingdog/FDStackView

1.2 UIStackView的属性

请添加图片描述

axis: 子视图的布局方向

  • Vertical: 垂直
  • Horizontal: 水平

alignment: 子视图的对齐方式

  • .fill: (默认) 尽可能铺满。
    在这里插入图片描述

  • .leading: 当 axis 是 vertical 的时候,按 leading 方向对齐 等价于: 当 axis 是 horizontal 的时候,按 top 方向对齐。
    在这里插入图片描述

  • .top: 当 axis 是 horizontal 的时候,按 top 方向对齐 等价于: 当 axis 是 vertical 的时候,按 leading 方向对齐
    在这里插入图片描述

  • .trailing: 当 axis 是 vertical 的时候,按 trailing 方向对齐 等价于: 当 axis 是 horizontal 的时候,按 bottom 方向对齐
    在这里插入图片描述

  • bottom: 当 axis 是 horizontal 的时候,按 bottom 方向对齐 等价于: 当 axis 是 vertical 的时候,按 trailing 方向对齐。
    在这里插入图片描述

  • .center:居中对齐。

在这里插入图片描述

  • .firstBaseline: 仅横轴有用, 按首行基线对齐
    在这里插入图片描述

  • .lastBaseline: 仅横轴有用, 按文章底部基线对齐。
    在这里插入图片描述

distribution:子视图的分布比例(大小)

  • .fill(默认) 根据compression resistance和hugging两个 priority 布局
    在这里插入图片描述

  • .fillEqually:每个子视图的高度或宽度保持一致。
    在这里插入图片描述

  • .fillProportionally:根据intrinsic content size按比例布局。
    在这里插入图片描述

  • .equalSpacing:等间距布局,如果放不下,根据compression resistance压缩
    在这里插入图片描述

  • .equalCentering:等中间线间距布局,元素间距不小于 spacing 定义的值, 如果放不下,根据compression resistance压缩。
    在这里插入图片描述

Spacing:子试视图间的间距

isBaselineRelativeArrangement默认 false)

决定了垂直轴如果是文本的话,是否按照 baseline 来参与布局。

isLayoutMarginsRelativeArrangement(默认 false)

如果打开则通过 layout margins 布局,关闭则通过 bounds

1.3 UIStackView相关方法

1、UIStackView的方法

  • init(frame: CGRect):创建一个 UIStackView
  • init(arrangedSubviews views: [UIView]):同样是创建一个 UIStackView,但我们可以将子视图传入。views 数组里的顺序即为子视图显示的顺序。
  • arrangedSubviews: [UIView] { get }:获得 UIStackView 里所有的子视图。它的顺序代表了 stack 堆叠的位置顺序,即视图元素的x轴和y轴,subviews它的顺序实际上是图层覆盖顺序,也就是视图元素的 z轴。
  • addArrangedSubview(view: UIView):添加一个子视图
  • removeArrangedSubview(view: UIView):删除一个子视图
  • insertArrangedSubview(view: UIView, at stackIndex: Int):在指定位置插入一个子视图

注意:

  • 如果一个元素没有被 addSubview,调用 arrangedSubviews 会自动 addSubview
  • 当一个元素被 removeFromSuperview ,则 arrangedSubviews也会同步移除
  • 当一个元素被 removeArrangedSubview, 不会触发 removeFromSuperview,它依然在视图结构中
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答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: UIStackViewiOS开发中非常常用的一种容器视图,它可以帮助我们快速搭建界面,并且自动进行内部子视图的布局管理。 在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: UIStackViewiOS开发中的一个布局容器,可以用来水平或垂直地排列一组视图。通过设置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、付费专栏及课程。

余额充值