iOS UI 布局

- 1 min

UIStackView

原文出自:什么是UIStackView ?


什么是UIStackView?

  在iOS9中苹果在UIKit框架中引入了一个新的视图类UIStackViewUIStackView类可以帮我们布局UI控件,而我们不需要设置任何约束或设置很少的约束就可以,其他都由UIStackView帮我们自动完成了。

  UIStackView提供了两个方向的约束,垂直布局和水平布局,我们可以通过UILayoutConstraintAxis枚举值来查看两种布局方式。

  如果初学者来学习UIStackView比较抽象,不太好接触这个新的控件,而且很容易出错,先看一下下面这个GIF来初步了解一下这个控件吧。

850342-20160223141112818-1227778081

UIStackView

  在Interface Builder中使用UIStackView就类似于使用一个UI控件一样,通过让将其他视图成为UIStackView的子视图来进行布局的,UIStackView也可以嵌套多个UIStackView

  值得注意的是,UIStackView虽然继承自UIView,但是并不参与屏幕的渲染,重写drawRect:方法也是无效的。

UIStackView继承链条,自身特性等信息850342-20160223141214083-1640121682

枚举值

  Interface Builder中的UIStackView控件,右侧设置面板中提供了一些选项,这些设置是对应着代码中的枚举值的:

    可以根据下面的图片结合上面的枚举值联系起来比较好理解

850342-20160223141315521-816832635

arrangedSubviews数组

  UIStackView使用arrangedSubviews数组来管理子视图。需要注意的是这个数组是一个readonly的属性,我们需要调用方法对arrangedSubviews数组进行操作。

  初始化数组:   - (instancetype)initWithArrangedSubviews:(NSArray<__kindof UIView *> *)views;   添加子视图:   - (void)addArrangedSubview:(UIView *)view;   移除子视图:   - (void)removeArrangedSubview:(UIView *)view;   根据下标插入视图:   - (void)insertArrangedSubview:(UIView *)view atIndex:(NSUInteger)stackIndex;

小试牛刀

  我们可以从Interface Builder右侧的操作面板中,选择UIStackView控件直接拖到XIB中。可以选择HorizontalVertical两个方向的UIStackView,也可以在拖到XIB中之后手动修改。

850342-20160223141431396-1614421270

​ 然后将两个View拖到这个UIStackView中,父视图也可以将UIStackView作为子视图来进行多层UIStackView嵌套,这也是苹果推荐的做法。

850342-20160223141511505-590301401

​ 打开右侧设置面板来设置UIStackView的一些属性,达到更好的布局效果。

850342-20160223141601068-641465840

  除了上面的方法也可以在XIB中直接选择多个View,然后点击右下方的Stack按钮,系统会自动推断布局方式,帮我们自动布局子视图,我们可以在系统布局之后在手动进行调整。

850342-20160223141629536-2074680886

  代码布局其实本质上就是对数组进行操作,数组中存储的是UIStackView的子视图。然后通过设置UIStackView的枚举值属性进行页面排布。代码布局的方式这里就不演示了。。。😉

UIStackView和NSLayoutConstraint布局转换

  如果你之前的项目中已经有约束,只需要将添加UIStackView管理UI控件约束清除。选中需要添加的UI控件,点击右下方的Stack按钮就可以。

850342-20160223141705661-808048020


以上原文出自:什么是UIStackView ?


以下内容摘自泊学网

Axis & Alignment

Content hugging & Content compression resistance

comments powered by Disqus
rss facebook twitter github youtube mail spotify instagram linkedin google google-plus pinterest medium vimeo stackoverflow reddit quora