iOS 开发之UIStackView的应用
————————————————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的应用的更多相关文章
- iOS开发之Socket通信实战--Request请求数据包编码模块
实际上在iOS很多应用开发中,大部分用的网络通信都是http/https协议,除非有特殊的需求会用到Socket网络协议进行网络数 据传输,这时候在iOS客户端就需要很好的第三方CocoaAsyncS ...
- iOS开发之UISearchBar初探
iOS开发之UISearchBar初探 UISearchBar也是iOS开发常用控件之一,点进去看看里面的属性barStyle.text.placeholder等等.但是这些属性显然不足矣满足我们的开 ...
- iOS开发之UIImage等比缩放
iOS开发之UIImage等比缩放 评论功能真不错 评论开通后,果然有很多人吐槽.谢谢大家的支持和关爱,如果有做的不到的地方,还请海涵.毕竟我一个人的力量是有限的,我会尽自己最大的努力大家准备一些干货 ...
- iOS开发之 Xcode6 添加xib文件,去掉storyboard的hello world应用
iOS开发之 Xcode6.1创建仅xib文件,无storyboard的hello world应用 由于Xcode6之后,默认创建storyboard而非xib文件,而作为初学,了解xib的加载原理 ...
- iOS开发之loadView、viewDidLoad及viewDidUnload的关系
iOS开发之loadView.viewDidLoad及viewDidUnload的关系 iOS开发之loadView.viewDidLoad及viewDidUnload的关系 标题中所说的3个方 ...
- iOS开发之info.pist文件和.pch文件
iOS开发之info.pist文件和.pch文件 如果你是iOS开发初学者,不用过多的关注项目中各个文件的作用.因为iOS开发的学习路线起点不在这里,这些文件只会给你学习带来困扰. 打开一个项目,我们 ...
- iOS开发之WKWebView简单使用
iOS开发之WKWebView简单使用 iOS开发之 WKWebVeiw使用 想用UIWebVeiw做的,但是突然想起来在iOS8中出了一个新的WKWebView,算是UIWebVeiw的升级版. ...
- iOS 开发之Block
iOS 开发之Block 一:什么是Block.Block的作用 UI开发和网络常见功能的实现回调,按钮事件的处理方法是回调方法. 1. 按钮事件 target action 机制. 它是将一 ...
- iOS开发之Xcode常用调试技巧总结
转载自:iOS开发之Xcode常用调试技巧总结 最近在面试,面试过程中问到了一些Xcode常用的调试技巧问题.平常开发过程中用的还挺顺手的,但你要突然让我说,确实一脸懵逼.Debug的技巧很多,比如最 ...
随机推荐
- 如何将同一 VNET 下的虚拟机从经典部署模型迁移到 Azure Resource Manager
本文内容 适用场景 解决方案 适用场景 用户拥有多个云服务但是在同一个 VNET 下,希望将这些虚拟机从经典部署模型(以下简称:ASM)迁移到 Azure Resource Manager(以下简称: ...
- [翻译] UIGlossyButton
UIGlossyButton https://github.com/waterlou/UIGlossyButton Feature create standard iPhone buttons wit ...
- swift版的枚举变量
swift版的枚举变量 swift的枚举类型跟普通的类是极为类似的,使用的时候,请不要以为他是一个常量,以下是测试用源码 // // ViewController.swift // SwiftEnum ...
- spring4声明式事务--01注解方式
1.在spring配置文件中引入 tx 命名空间 xmlns:tx="http://www.springframework.org/schema/tx" 2.配置事务管理器 < ...
- mysql 注入基础知识
(1)注入的分类---仁者见仁,智者见智. 下面这个是阿德玛表哥的一段话,个人认为分类已经是够全面了.理解不了跳过,当你完全看完整个学习过程后再回头看这段.能完全理解下面的这些每个分类,对每个分类有属 ...
- 跟我一起阅读Java源代码之HashMap(二)
上一节中实现的SimpleHashMap,没有解决冲突的问题,这一节我们继续深入 由于table的大小是有限的,而key的集合范围是无限大的,所以寄希望于hashcode散落,肯定会出现多个key散落 ...
- CORS跨域模型浅析及常见理解误区分析
CORS跨域资源共享是前后端跨域十分常用的一种方案,主要依赖Access-Control-Allow(ACA)系列header来实现一种协商性的跨域交互. 基本模型 其中的具体流程大致可以分为以下几步 ...
- vue 校验插件 veeValidate使用
1.内置的校验规则 after{target} - 比target要大的一个合法日期,格式(DD/MM/YYYY) alpha - 只包含英文字符 alpha_dash - 可以包含英文.数字.下 ...
- 如何使用jackson美化输出json/xml
如何使用jackson美化输出json/xml 1.美化POJO序列化xml 下面将POJO列化为xml并打印. Person person = new Person(); //设置person属性 ...
- BZOJ2729:[HNOI2012]排队(组合数学)
Description 某中学有 n 名男同学,m 名女同学和两名老师要排队参加体检.他们排成一条直线,并且任意两名女同学不能相邻,两名老师也不能相邻,那么一共有多少种排法呢?(注意:任意两个人都是不 ...