UIStackView

作者: bianruifeng | 来源:发表于2020-07-18 18:19 被阅读0次

UIStackView共四个属性:
1、axis 排列
2、distribution 填充
3、alignment 对齐
4、spacing 间距

  • Axis
typedef NS_ENUM(NSInteger, UILayoutConstraintAxis) {
    UILayoutConstraintAxisHorizontal = 0 ,    //水平方向布局 (默认)
    UILayoutConstraintAxisVertical = 1         //垂直方向布局
};
  • Distribution
    Fill -> UIStackViewDistributionFill
    填充整个UIStackView,并且根据内部子视图尺寸对子视图尺寸进行动态调整。
    Fill Equally -> UIStackViewDistributionFillEqually
    根据视图大小平均分配UIStackView尺寸,等比例填充UIStackView,过程中会根据分配的大小改变子视图尺寸。
    Fill Proportionally -> UIStackViewDistributionFillProportionally
    根据之前的比例填充UIStackView。
    Equal Spacing -> UIStackViewDistributionEqualSpacing
    填充整个UIStackView,子视图没有占满UIStackView将会用空白平均填充子视图中间的间距,超出UIStackView将会根据arrangedSubviews数组下标压缩子视图。
    Equal Centering -> UIStackViewDistributionEqualCentering
    平均分配子视图得到每个视图的中心点,使用这个中心点来布局每个子视图,并且保持spacing距离,超出将会重新布局子视图,并压缩部分子视图。

  • Alignment
    Fill -> UIStackViewAlignmentFill
    视图纵向填充
    Top -> UIStackViewAlignmentTop
    视图向上对其(适用于Horizontal模式)
    Center -> UIStackViewAlignmentCenter
    视图居中对其
    Bottom -> UIStackViewAlignmentBottom
    视图向下对其(适用于Horizontal模式)
    First Baseline -> UIStackViewAlignmentFirstBaseline
    根据上方基线布局所有子视图的y值(适用于Horizontal模式)
    Last Baseline -> UIStackViewAlignmentLastBaseline
    根据下方基线布局所有子视图的y值(适用于Horizontal模式)
    trailing -> UIStackViewAlignmentTrailing
    视图向左对齐(适用于Vertical模式)
    leading -> UIStackViewAlignmentLeading
    视图向右对齐(适用于Vertical模式)

  • spacing
    spacing -> CGFloat spacing
    子控件之间的最小距离

  • isBaselineRelativeArrangement(默认 false)
    决定了垂直轴如果是文本的话,是否按照 baseline 来参与布局。

  • isLayoutMarginsRelativeArrangement (默认 false)
    如果打开则通过 layout margins 布局,关闭则通过 bounds

演示如图:


image.png

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;

编码添加约束:
UIStackView 的布局使用frame是没有任何效果的。
可以与其他约束框架Masonry混合使用,仅能约束宽高,不能约束边界。

- (void) setup {

    //View 1
    UIView *view1 = [[UIView alloc] init];
    view1.backgroundColor = [UIColor blueColor];
    [view1 mas_makeConstraints:^(MASConstraintMaker *make) {
        make.size.mas_equalTo(CGSizeMake(50, 100));
    }];
//    [view1.heightAnchor constraintEqualToConstant:100].active = true;
//    [view1.widthAnchor constraintEqualToConstant:120].active = true;


    //View 2
    UIView *view2 = [[UIView alloc] init];
    view2.backgroundColor = [UIColor greenColor];
    [view2 mas_makeConstraints:^(MASConstraintMaker *make) {
        make.size.mas_equalTo(CGSizeMake(300, 20));
    }];
//    [view2.heightAnchor constraintEqualToConstant:100].active = true;
//    [view2.widthAnchor constraintEqualToConstant:70].active = true;

    //View 3
    UIView *view3 = [[UIView alloc] init];
    view3.backgroundColor = [UIColor magentaColor];
    [view3.heightAnchor constraintEqualToConstant:100].active = true;
    [view3.widthAnchor constraintEqualToConstant:180].active = true;

    //Stack View
    UIStackView *stackView = [[UIStackView alloc] init];

    stackView.axis = UILayoutConstraintAxisVertical;
    stackView.distribution = UIStackViewDistributionEqualSpacing;
    stackView.alignment = UIStackViewAlignmentCenter;
    stackView.spacing = 30;

    [stackView addArrangedSubview:view1];
    [stackView addArrangedSubview:view2];
    [stackView addArrangedSubview:view3];

    stackView.translatesAutoresizingMaskIntoConstraints = false;
    [self.view addSubview:stackView];


    //Layout for Stack View
    [stackView.centerXAnchor constraintEqualToAnchor:self.view.centerXAnchor].active = true;
    [stackView.centerYAnchor constraintEqualToAnchor:self.view.centerYAnchor].active = true;
}

效果如图:


6.png

相关文章

  • 【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...

  • UIStackView的妙用

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

  • 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/ycefkktx.html