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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,393评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,790评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,391评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,703评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,613评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,003评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,507评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,158评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,300评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,256评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,274评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,984评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,569评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,662评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,899评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,268评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,840评论 2 339

推荐阅读更多精彩内容

  • 一、UIStackView简介 概念:一个堆叠视图的容器,iOS9的新特性。 用途:StackView及其子视图会...
    麦穗0615阅读 3,703评论 0 12
  • UIStackView堆叠视图,自动布局平铺不重叠控件。减少手动约束,可以嵌套。 属性: /* 被排列子视图数组*...
    负心薄幸的龙哥阅读 1,497评论 0 2
  • 我的博客, 各位看官有时间赏光 UIStackView UIStackView介绍 随着autolayout的推广...
    VIC_LI阅读 8,906评论 0 17
  • 版本记录 前言 iOS中的视图加载可以有两种方式,一种是通过xib加载,另外一种就是通过纯代码加载。它们各有优点和...
    刀客传奇阅读 5,319评论 0 7
  • 距离iOS9发布已经接近一年了,我们即将引来新的iOS 10,为何在这个时候来介绍iOS9中新引入的一个布局组件呢...
    CZ_iOS阅读 7,453评论 9 59