美文网首页
UIStackView的妙用

UIStackView的妙用

作者: jack2gs | 来源:发表于2016-11-13 16:31 被阅读0次

UIStackView简介

UIStackView是iOS 9+支持的布局控件,主要用于线性布局,可以简化布局,减少约束的使用。之前学过些WPF,它也有一个类似的布局控件。不得不说用起来确实很方便。

应用场景

主要用于线性布局,支持横向和纵向

主要属性

  • axis属性决定布局方向,水平或垂直;
  • distribution设置布局方向的布局方式;
  • alignment设置垂直于布局方向的方向的布局方式;
  • spacing,使用该属性可以设置子视图的最小间距;
  • isBaselineRelativeArrangement,该属性决定了垂直方向的视图间距是否从基准线开始计算;
  • isLayoutMarginsRelativeArrangement,该属性决定了子视图的布局是否相对于他的 layout margins

本文没有涉及最后两个属性。

为什么要使用UIStackView

UIStackView可以在一定程度上减少约束,简化布局,并且使用灵活。在下一节,我将用两种布局思路实现一个简单的登录界面。

使用UIStackView需要注意的地方

  • UIStackView本身是基于Auto Layout实现的,也就是说它会自动帮你生成一些约束。因此,当你给子视图添加约束时,注意不要跟这些隐含的约束冲突。
  • 在处理含有intrinsicContentSize属性控件的时候,注意Content HuggingContent Compression Resistance约束的优先级,否则会造成拉伸错误。
  • UIStackView没有intrinsicContentSize属性。

使用UIStackView实现简单的登录界面

这一节,我将使用两种思路实现一个简单的登录界面。思路一参照 Auto Layout Guide,将一个UILabel和一个UITextField放入到同一个UIStackView中,也就是有几行就会有几个UIStackView我称之为以行为主。思路二,将所有的UILabel放入到一个UIStackView中,将所有的UITextField放入到一个UIStackView中,也就是有几列数据就会有几个UIStackView,我称之为以列为主。

思路一:以行为主

这种思路参照了Auto Layout Guide,比较容易想到。每当需要添加一行时,添加一个UIStackView就好了,如下图所示:

以行为主

图中,

  • 白色的矩形框表示UIStackView
  • 粉色的矩形框表示UILabel
  • 绿色的矩形框表示UITextField

需要的约束有:

  1. 对于最外层的UIStackView,为垂直方向布局:
  • leading等于父视图的leadingMargin
  • trailing等于父视图的trailingMargin
  • top等于topLayoutGuide的bottom
  1. 对于所有的UILabel
  • Content Hugging的优先级为251
  1. 对于所有的UITextField
  • Content Hugging的优先级为250
  • width相等

思路二:以列为主

这种思路以列为先,有几列数据就设置几个UIStackView

以列为主

需要的约束有:

  1. 对于最外层的UIStackView,为垂直方向布局:
  • leading等于父视图的leadingMargin
  • trailing等于父视图的trailingMargin
  • top等于topLayoutGuide的bottom
  1. 对于所有的UILabel
  • Content Hugging的优先级为251
  1. 对于所有的UITextField
  • Content Hugging的优先级为250
  1. 对于所有的子UIStackView
  • 高度相等

另外,需要注意的是,为了使UILabelUITextField更好地对齐,需要设置UILabel所在的UIStackViewDistribution为 * Fill Equally*。

对比

上述两种思路均可以达到目的,复杂性也比较类似。但是就灵活性而言,思路二更好一些。每当需要添加或删除一行时,思路一可能需要重新设置宽度约束,而思路二不需要调整约束。但是,Content Hugging的优先级二者都需要考虑。

讨论

苹果引入UIStackView的初衷是为了降低布局的复杂度,并建议优先采用它解决布局问题。从本文可以看出,UIStackView的使用比较简单,可以手动额外添加所需的约束,比较灵活。此外,本文中还有其他一些UIStackView特性没涉及到,比如说动态添加元素等,你可以参考下官方的文档。项目示例代码见GitHub

参考文献

  1. Auto Layout Guide
  2. UIStackView

相关文章

  • UIStackView的妙用

    UIStackView简介 UIStackView是iOS 9+支持的布局控件,主要用于线性布局,可以简化布局,减...

  • 【UIKit】UIStackView

    UIStackView UIStackView : UIViewiOS 9.0 基于 Flexbox 思想的布局方...

  • iOS9 新特新介绍

    一. UIStackView 新控件:UIStackView 栈视图, 类似AppleWatch的Group 父类...

  • StackView

    我的博客, 各位看官有时间赏光 UIStackView UIStackView介绍 随着autolayout的推广...

  • UIStackView的应用

    UIStackView的定义 UIStackView控件有两种,横向布局和纵向布局 Axis:设置UIStackV...

  • UIStackView 初探(译)

    UIStackView 用于在列或行中布局视图集合的线性接口。 UIStackView 概览 UIStackVie...

  • iOS9新特性UIStackView

    概述 UIStackView是iOS9中新增的API,类似于Android中的线性布局。UIStackView提供...

  • UIStackView简单理解和使用

    一、UIStackView简介 UIStackView是iOS9中新增的API,类似于Android中的线性布局。...

  • iOS UIStackView

    简介 UIStackView是iOS 9 的新增控件,唯一的作用就是帮助布局 本文会详细介绍UIStackView...

  • UIStackView学习笔记

    UIStackView UIStackView能够利用,创建能够动态适应设备方向、屏幕大小和可用空间中任何更改的用...

网友评论

      本文标题:UIStackView的妙用

      本文链接:https://www.haomeiwen.com/subject/jmscpttx.html