iOS UIStackView

使用stackview模仿计算器布局

简介

UIStackView是iOS 9 的新增控件,唯一的作用就是帮助布局

本文会详细介绍UIStackView的使用,可以参考代码理解,上图就是使用stackview制作的计算器UI,也在此代码库中.

内部控件如何布局

在给内部控件进行布局之前,stackview应该首先有确定的布局,内部子控件可以不设置frame或者约束,而使用stackview的属性来完成布局

决定UIStackView内部控件的布局具体布局主要是axis,space,alignment,alignment,其中稍微绕一些是distributionalignment,理解这两个属性首先需要理解轴方向,也就是属性axis值.

distribution控制子视图沿轴方向的布局

alignment控制子视图垂直于轴方向的布局

详细解释如下所示. 如果还是不好理解可以参考代码看下效果

用来测试UIStackview的Demo

open var axis: NSLayoutConstraint.Axis // 子控件布局方向(水平或者垂直),也就是下面说的轴方向,
/**
case fill   沿轴方向填充视图.会按照优先级压缩或者拉伸子视图
case fillEqually    沿轴方向使子视图等宽或者等高
case fillProportionally     沿轴方向按照`intrinsic content`的比例压缩或者拉伸
case equalSpacing   沿轴按照优先级压缩或者拉伸子视图,使间隙相等
case equalCentering     沿轴方向子视图中心等分
*/
open var distribution: UIStackView.Distribution // 轴方向的控件布局方式
/**
case fill   垂直于轴方向填充视图
case center     子视图中心和轴线重合

case leading    .vertical 情况下使用,垂直于轴方向靠左
case trailing   .vertical 情况下使用,垂直于轴方向靠右

case top    .horizontal 情况下使用,子视图
public static var bottom: UIStackView.Alignment { get } .horizontal 情况下使用
case firstBaseline  .horizontal 情况下使用, 按照第一个子视图的baseline对齐,并保证最高视图底部对齐
case lastBaseline   .horizontal 情况下使用, 按照最后一个子视图的baseline对齐,并保证最高视图顶部对齐
*/
open var alignment: UIStackView.Alignment // 非轴方向的控件布局方式
open var spacing: CGFloat // 子控件的最小间距

以下个人感觉比较重要摘抄下来,出自

For all distributions except the UIStackView.Distribution.fillEqually distribution, the stack view uses each arranged view’s intrinsicContentSize property when calculating its size along the stack’s axis.

For all alignments except the UIStackView.Alignment.fill alignment, the stack view uses each arranged view’s intrinsicContentSize property when calculating its size perpendicular to the stack’s axis.

大致含义是除了fillEquallyfill,stackview在计算size的时候使用子控件的intrinsicContentSize属性

内部控件添加约束

stackview不仅可以使用属性自动计算约束,也可以主动添加约束,可以代码中的计算器布局

另外也可以使用iOS 11新增apisetCustomSpacing来调整两个子控件之间距离

动态改变stackview的内容

当stackview的属性改变,或者添加/删除arrangedSubviews的时候.stackview可以动态的更新layout

需要注意的是:如果把view从arrangedSubviews移除,此时被移除的view还是属于stackview的subview,如果可见的话是会显示出来的.个人感觉这点比较坑,不太懂为何这么设计.

stackview 的显示

虽然stackview继承自UIView,但是并不会渲染什么内容,仅仅是给arrangedSubviews提供布局而已

所以设置stackviewbackgroundColor没有任何效果,也不能够重写draw等方法

参考

apple UIStackview

UIStackview 使用起来还是比较方便的,熟练使用能够减少繁琐的UI布局,希望你会喜欢
最后推荐一个使用UIStackview的demo:UIStackViewPlayground

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • UIStackView堆叠视图,自动布局平铺不重叠控件。减少手动约束,可以嵌套。 属性: /* 被排列子视图数组*...
    负心薄幸的龙哥阅读 5,373评论 0 2
  • 我的博客, 各位看官有时间赏光 UIStackView UIStackView介绍 随着autolayout的推广...
    VIC_LI阅读 13,122评论 0 17
  • 版本记录 前言 iOS中的视图加载可以有两种方式,一种是通过xib加载,另外一种就是通过纯代码加载。它们各有优点和...
    刀客传奇阅读 10,826评论 0 7
  • 距离iOS9发布已经接近一年了,我们即将引来新的iOS 10,为何在这个时候来介绍iOS9中新引入的一个布局组件呢...
    CZ_iOS阅读 12,244评论 9 59
  • 人生能有几次转折呢,如果说我的第一次重大的转折的话,那大概就是我第一次我的考研了吧,考完一天之后,第二天的考试我怎...
    浅淡划过阅读 1,396评论 0 0

友情链接更多精彩内容