————————————————UIStackView的应用————————————————

一:先讲下优势:

对于排布列表式控件的布局需求,用UIStackView控件,开发中为我们省去了繁琐的代码,便利了布局

布局图片演示:

                     

垂直布局样式                                                                水平布局样式

二:在应用之前,先介绍几个属性

  • —Axis--

是设置布局的方向,有水平和垂直两种方式,一个StackView只能选择一种布局模式。

  • —Alignment--

是选择其管理视图的对齐模式,我们这里选择充满。

  • -Distribution-

是设置其管理视图的排列方式,我们选择等宽充满。

  • —Spacing--

是设置视图之间的间距,默认设置为10.

三:分析注意

之后有一点需要注意,stackView用于布局其内部管理的视图,对于它本身,我们还需要添加一些约束,将它约束在屏幕的中间。

我们向其中拖入任意数量的view,设置不同的颜色,就实现了我们想要的效果,并且可以随意动态删除和添加其中的view数量,不需要改变约束。

四:UIStackView的创建

  • --动态添加视图--

UIView * newView = [[UIView alloc]init];

[stackView addArrangedSubview:newView];

addArrangedSubview和addSubview有很大的区别,使用前者是将试图添加进StackView的布局管理,

后者只是简单的加在试图的层级上,并不接受StackView 的布局管理

  • --动画效果--

因为StackView继承于UIView,因此在布局改变的时候,我们可以使用UIView层的动画,如下:

//注意:在添加view的时候会有动画效果,移除的时候没有

[stackView addArrangedSubview:newView];

[UIView animateWithDuration:1  animations:^{

[stackView layoutIfNeeded];

}];

  • --方法管理---

//初始化方法,通过数组传入被管理的视图

- (instancetype)initWithArrangedSubviews:(NSArray<__kindof UIView *> *)views;

//获取被管理的所有视图

@property(nonatomic,readonly,copy) NSArray<__kindof UIView *> *arrangedSubviews;

//添加一个视图进行管理

- (void)addArrangedSubview:(UIView *)view;

//移除一个被管理的视图

- (void)removeArrangedSubview:(UIView *)view;

//在指定位置插入一个被管理的视图

- (void)insertArrangedSubview:(UIView *)view atIndex:(NSUInteger)stackIndex;

  • ---与StackView布局设置相关:---

     1.布局模式:

@property(nonatomic) UILayoutConstraintAxis axis;

注意:上面这个属性用于设置布局的模型,枚举如下:

//stackView只有两种布局模式 水平和竖直

typedef NS_ENUM(NSInteger, UILayoutConstraintAxis) {

UILayoutConstraintAxisHorizontal = 0,//水平布局

UILayoutConstraintAxisVertical = 1    //竖直布局

};

     2.对齐模式: 

@property(nonatomic) UIStackViewAlignment alignment;

注意:这个属性用于设置控件的对其模式,枚举如下:

typedef NS_ENUM(NSInteger, UIStackViewAlignment) {

UIStackViewAlignmentFill,                                                        //水平布局时为高度充满,竖直布局时为宽度充满

UIStackViewAlignmentLeading,                                                 //前边对其

UIStackViewAlignmentTop = UIStackViewAlignmentLeading,        //顶部对其

UIStackViewAlignmentFirstBaseline,                                          //第一个控件文字的基线对其 水平布局有效

UIStackViewAlignmentCenter,                                                  //中心对其

UIStackViewAlignmentTrailing,                                                 //后边对其

UIStackViewAlignmentBottom = UIStackViewAlignmentTrailing,    //底部对其

UIStackViewAlignmentLastBaseline,                                          //基线对其,水平布局有效

} NS_ENUM_AVAILABLE_IOS(9_0);

     3.排列方式

@property(nonatomic) UIStackViewDistribution distribution;

注意:排列方式的枚举如下:

typedef NS_ENUM(NSInteger, UIStackViewDistribution) {

UIStackViewDistributionFill = 0,              //充满,当只有一个控件时可以使用

UIStackViewDistributionFillEqually,          //平分充满,每个控件占据相同尺寸排列充满

UIStackViewDistributionFillProportionally, //会优先按照约束的尺寸进行排列,如果没有充满,会拉伸最后一个排列的控件充满

UIStackViewDistributionEqualSpacing,     //等间距排列

UIStackViewDistributionEqualCentering,   //中心距离相等

} NS_ENUM_AVAILABLE_IOS(9_0);

    4.其他

//设置最小间距

@property(nonatomic) CGFloat spacing;

//设置布局时是否参照基线

@property(nonatomic,getter=isBaselineRelativeArrangement) BOOL baselineRelativeArrangement;

//设置布局时是否以控件的LayoutMargins为标准,默认为NO,是以控件的bounds为标准

@property(nonatomic,getter=isLayoutMarginsRelativeArrangement) BOOL layoutMarginsRelativeArrangement;

五:实战案例代码(包括: *  独立处理指定子控件的某一布局属性)

-(void)setupUIUIStackView{

NSMutableArray <UIImageView *>*rray = [NSMutableArray array];

for(int i = 0;i < 4;i++){

UIImage *image = [UIImage imageNamed:@"ic_sport_gps_map_mixmode_selected"];

UIImageView *imageView = [[UIImageView alloc]initWithImage:image];

//布局尺寸优先级最高

if (i == 1) {

//-------------注意:这里是独立处理指定子控件的高度布局属性--------------

[imageView mas_makeConstraints:^(MASConstraintMaker *make) {

make.height.equalTo(@65);

}];

}

[rray addObject:imageView];

}

UIStackView *stackView = [[UIStackView alloc]initWithArrangedSubviews:rray];

[self.view addSubview:stackView];

//父类布局

[stackView mas_makeConstraints:^(MASConstraintMaker *make) {

make.center.equalTo(self.view);

make.height.equalTo(@80);

make.width.equalTo(@300);

}];

//子类布局

[stackView setAxis:UILayoutConstraintAxisHorizontal];                      //排列类型

[stackView setDistribution:UIStackViewDistributionFillEqually];           //子控件大小一样

[stackView setSpacing:20];                                                            //子控件间距

[stackView setAlignment:UIStackViewAlignmentBottom];                   //底部对其

//添加动画

[UIView animateWithDuration:1.3 animations:^{

[stackView layoutIfNeeded];

}];

}

效果图:注(创建的时候会带动画效果)

结束语:到这里基本开发的用法我就讲完了。

由于发现项目中很少有人用这个简便的控件,所以今天有空出了这章讲解,各位iOS的开发热爱者们可以先用起来了!

如用纠正,欢迎交流!

iOS 开发之UIStackView的应用的更多相关文章

  1. iOS开发之Socket通信实战--Request请求数据包编码模块

    实际上在iOS很多应用开发中,大部分用的网络通信都是http/https协议,除非有特殊的需求会用到Socket网络协议进行网络数 据传输,这时候在iOS客户端就需要很好的第三方CocoaAsyncS ...

  2. iOS开发之UISearchBar初探

    iOS开发之UISearchBar初探 UISearchBar也是iOS开发常用控件之一,点进去看看里面的属性barStyle.text.placeholder等等.但是这些属性显然不足矣满足我们的开 ...

  3. iOS开发之UIImage等比缩放

    iOS开发之UIImage等比缩放 评论功能真不错 评论开通后,果然有很多人吐槽.谢谢大家的支持和关爱,如果有做的不到的地方,还请海涵.毕竟我一个人的力量是有限的,我会尽自己最大的努力大家准备一些干货 ...

  4. iOS开发之 Xcode6 添加xib文件,去掉storyboard的hello world应用

    iOS开发之  Xcode6.1创建仅xib文件,无storyboard的hello world应用 由于Xcode6之后,默认创建storyboard而非xib文件,而作为初学,了解xib的加载原理 ...

  5. iOS开发之loadView、viewDidLoad及viewDidUnload的关系

    iOS开发之loadView.viewDidLoad及viewDidUnload的关系 iOS开发之loadView.viewDidLoad及viewDidUnload的关系    标题中所说的3个方 ...

  6. iOS开发之info.pist文件和.pch文件

    iOS开发之info.pist文件和.pch文件 如果你是iOS开发初学者,不用过多的关注项目中各个文件的作用.因为iOS开发的学习路线起点不在这里,这些文件只会给你学习带来困扰. 打开一个项目,我们 ...

  7. iOS开发之WKWebView简单使用

    iOS开发之WKWebView简单使用   iOS开发之 WKWebVeiw使用 想用UIWebVeiw做的,但是突然想起来在iOS8中出了一个新的WKWebView,算是UIWebVeiw的升级版. ...

  8. iOS 开发之Block

    iOS 开发之Block 一:什么是Block.Block的作用 UI开发和网络常见功能的实现回调,按钮事件的处理方法是回调方法. 1.     按钮事件 target action 机制. 它是将一 ...

  9. iOS开发之Xcode常用调试技巧总结

    转载自:iOS开发之Xcode常用调试技巧总结 最近在面试,面试过程中问到了一些Xcode常用的调试技巧问题.平常开发过程中用的还挺顺手的,但你要突然让我说,确实一脸懵逼.Debug的技巧很多,比如最 ...

随机推荐

  1. java基础(九) 可变参数列表介绍

    一.可变参数简介 在不确定参数的个数时,可以使用可变的参数列表. 1. 语法: 参数类型...(三个点) 例如: void printArray(Object...) 注意: 每个方法最多只有一个可变 ...

  2. 回归JavaScript基础(四)

    主题:JavaScript变量.作用域和内存问题 JavaScript的变量和别的语言比起来是与众不同的.说道变量,不得不谈他的作用域.同很多语言一样,JavaScript开发者也不用担心开发中内存的 ...

  3. 使用dva脚手架(dva-cli)快速构建React项目

    安装 dva-cli 你应该会更希望关注逻辑本身,而不是手动敲入一行行代码来构建初始的项目结构,以及配置开发环境. 那么,首先需要安装的是 dva-cli .dva-cli 是 dva 的命令行工具, ...

  4. MySQL无法启动、服务没有报告任何错误&初次登陆错误的解决

    先以管理员身份运行cmd(右键单击左下角win菜单) 输入mysqld -install,net start mysql,下图是返回结果.报错情况以及修正之后的全过程 启动失败之后输入mysqld - ...

  5. linux ubuntu 本地镜像 软件源 制作方法

    1.配置当前软件源,镜像非常大,所以首先要配置一下载速度快的软件源http://fffo.blog.163.com/blog/static/2119130682014322104136601/2.安装 ...

  6. MySQL上机实习报告(一)

    一.实习内容    利用wamp进行MySQL上机实习,建立数据库和一个学生信息表,并能对建的表进行数据插入.修改.查询和删除等内容. 二.实习目的 能将课堂上所学的内容运用到实际的上机操作中,进一步 ...

  7. 2. 跟踪标记 (Trace Flag) 3604, 3605 输出DBCC命令结果

    跟踪标记:3604 功能: 输出DBCC命令返回结果到查询窗口(通常是SSMS窗口),类似print命令的显示效果: 用途: 常用于获取DBCC IND, DBCC PAGE命令的输出结果,因为这2个 ...

  8. 开源作业调度框架 - Quartz.NET - 实战使用1

    简介: 第一步:下载Quartz.NET 下载Quartz.NET只需要打开网址选择适宜的版本进行下载解压缩即可. 目前最新版本是2.3.3,压缩包为6MB,不过鉴于国内网速.我还是加一下博客园的下载 ...

  9. 企业生产环境集群稳定性-HA就行吗?

    在企业生产中,集群一旦运行,是要尽可能的将损失降到最低,现在所有的大数据技术都有HA,spark的.Hadoop的.HBase的等等, HA分冷备和热备,热备是集群自带的,冷备就是硬件的. 这样一种情 ...

  10. Uva1395 POJ3522 Slim Span (最小生成树)

    Description Given an undirected weighted graph G, you should find one of spanning trees specified as ...