热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

iOS9中UIStackView的使用

概述UIStackView是iOS9中新增的API,类似于Android中的线性布局。UIStackView相当于一个容器,根据向UIStackView中添加视图的顺序,UIStack

概述

UIStackViewiOS 9中新增的API,类似于Android中的线性布局。UIStackView相当于一个容器,根据向UIStackView中添加视图的顺序,UIStackView会自动给这些视图添加约束,让这些视图根据内容,垂直或水平排列。由于UIStackView会自动给它里面的子视图添加约束,所以我们不必再为那些子视图添加约束,我们只要给UIStackView设置一些属性与其子视图的压缩或者拉伸的优先级就可以简单的实现视图布局。 
如果稍微复杂的界面可以嵌套使用UIStackView,可以向UIStackView中添加UIStackView,本质上都是继承UIView

UIStackView介绍

介绍UIStackView中主要的API。图片来自于苹果官方文档


  • 初始化
- (instancetype)initWithArrangedSubviews:(NSArray<__kindof UIView *> *)views;
//初始化方法传入需要用UIStackView管理的存放子视图的数组,并按照数组中的顺序添加这些子视图。
  • 1
  • 2
  • 添加/移除子视图
- (void)addArrangedSubview:(UIView *)view;
//添加view到UIStackView对象上并且让UIStackView管理这个view布局

- (void)removeArrangedSubview:(UIView *)view;
//取消UIStackView的管理,但是这个view不从UIStackView上移除

- (void)insertArrangedSubview:(UIView *)view atIndex:(NSUInteger)stackIndex;
//UIStackView管理存放子视图的数组,按照顺序来布局,这个方法是向这个数组里指定位置添加view
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • UIStackView排列方式
typedef NS_ENUM(NSInteger, UILayoutConstraintAxis) {
UILayoutCOnstraintAxisHorizontal= 0, //子视图水平排列
UILayoutCOnstraintAxisVertical= 1 //子视图垂直排列
};
@property(nonatomic) UILayoutConstraintAxis axis;
//这个属性是用来设置UIStackView中子视图的排列方式
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 子视图分布样式
typedef NS_ENUM(NSInteger, UIStackViewDistribution) {
UIStackViewDistributiOnFill= 0,
UIStackViewDistributionFillEqually,
UIStackViewDistributionFillProportionally,
UIStackViewDistributionEqualSpacing,
UIStackViewDistributionEqualCentering,
} NS_ENUM_AVAILABLE_IOS(9_0);

@property(nonatomic) UIStackViewDistribution distribution;
//UIStackView中子视图的分布样式
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

UIStackViewDistributionFill 
根据UIStackView的排列方式,用子视图铺满填充指定的方向,如果指定的UIStackView是垂直排列那么UIStackView中的子视图将填充满UIStackView的高度。如果指定的UIStackView是水平排列那么UIStackView中的子视图将填充满UIStackView的宽度。下图就是填充UIStackView的宽度示例。由于每个视图是由UIStackView自动添加约束的,要进行铺满操作就对视图进行拉伸,指定某个视图拉伸,可以更改其压缩或者拉伸的优先级实现。 

UIStackViewDistributionFillEqually 
UIStackViewDistributionFillEqually保证铺满后如果是垂直排列所有的子视图高度相等,如果是水平排列所有的子视图宽度相等。 

UIStackViewDistributionFillProportionally 
根据每个子视图里面内容的尺寸来进行填充操作 

UIStackViewDistributionEqualSpacing 
排列视图,保证每个子视图之间的间距相等 

UIStackViewDistributionEqualCentering 
排列视图,保证每个子视图中心直接的间距相等 

  • 子视图对齐方式
typedef NS_ENUM(NSInteger, UIStackViewAlignment) {
UIStackViewAlignmentFill,
UIStackViewAlignmentLeading,
UIStackViewAlignmentTop = UIStackViewAlignmentLeading,
UIStackViewAlignmentFirstBaseline,
UIStackViewAlignmentCenter,
UIStackViewAlignmentTrailing,
UIStackViewAlignmentBottom = UIStackViewAlignmentTrailing,
UIStackViewAlignmentLastBaseline,
} NS_ENUM_AVAILABLE_IOS(9_0);
@property(nonatomic) UIStackViewAlignment alignment;
//设置`UIStackView`中子视图对齐的方式
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

UIStackViewAlignmentFill 
UIStackView是垂直排列那么子视图的水平方向的左右边界与UIStackView上下边界对齐,如果是水平排列那么子视图的垂直方向的上下边界与UIStackView上下边界对齐。

UIStackViewAlignmentLeading 
UIStackView是垂直排列时此值有效,让所有的子视图靠UIStackView左边界对齐。

UIStackViewAlignmentTop 
UIStackView是水平排列时此值有效,让所有的子视图靠UIStackView上边界对齐。

UIStackViewAlignmentFirstBaseline 
UIStackView是水平排列时此值有效,所有的子视图以每个视图中的第一行基准线对齐。

UIStackViewAlignmentCenter 
所有的子视图中心与UIStackView的中心基准线对齐,如果UIStackView是水平排列那么所有子视图高度的中点与UIStackView高度中点对齐,如果如果UIStackView是垂直排列那么所有子视图宽度的中点与UIStackView宽度中点对齐。

UIStackViewAlignmentTrailing 
UIStackView是垂直排列时此值有效,让所有的子视图靠UIStackView右边界对齐。

UIStackViewAlignmentBottom 
UIStackView是水平排列时此值有效,让所有的子视图靠UIStackView下边界对齐。

UIStackViewAlignmentLastBaseline 
UIStackView是水平排列时此值有效,所有的子视图以每个视图中的最后一行基准线对齐。

  • 子视图之间的间距
@property(nonatomic)CGFloat spacing//每个子视图之间的间距,在某些布局的情况下spacing将作为最小的间距。

UIStackView使用

代码示例

- (void)viewDidLoad {
[super viewDidLoad];
UILabel *label1 = [[UILabel alloc] init];
label1.text = @"label1";
label1.textColor = [UIColor whiteColor];
label1.backgroundColor = [UIColor orangeColor];
UILabel *label2 = [[UILabel alloc] init];
label2.text = @"label2";
label2.textColor = [UIColor whiteColor];
label2.backgroundColor = [UIColor grayColor];
UILabel *label3 = [[UILabel alloc] init];
label3.text = @"this is label3";
label3.textColor = [UIColor whiteColor];
label3.backgroundColor = [UIColor brownColor];
// 初始化三个Label

UIStackView *_stackView = [[UIStackView alloc] initWithArrangedSubviews:@[label1,label2,label3]];
_stackView.axis = UILayoutConstraintAxisHorizontal;
//_stackView中的子视图水平排列
_stackView.distribution = UIStackViewDistributionFillProportionally;
//按照内容填充水平方向_stackView的宽度。
_stackView.alignment = UIStackViewAlignmentCenter;
//所有的子视图高度的中点与_stackView的高度中点对齐
_stackView.spacing = 5;
//子视图之间的间距为5
_stackView.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);
[self.view addSubview:_stackView];
// Do any additional setup after loading the view, typically from a nib.
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

示例效果 

如果更改UIStackView对象的某些属性

- (void)viewDidLoad {
[super viewDidLoad];
UILabel *label1 = [[UILabel alloc] init];
label1.text = @"label1";
label1.textColor = [UIColor whiteColor];
label1.backgroundColor = [UIColor orangeColor];
UILabel *label2 = [[UILabel alloc] init];
label2.text = @"label2";
label2.textColor = [UIColor whiteColor];
label2.backgroundColor = [UIColor grayColor];

UILabel *label3 = [[UILabel alloc] init];
label3.text = @"this is label3";
label3.textColor = [UIColor whiteColor];
label3.backgroundColor = [UIColor brownColor];
// 初始化三个Label

UIStackView *_stackView = [[UIStackView alloc] initWithArrangedSubviews:@[label1,label2,label3]];
_stackView.axis = UILayoutConstraintAxisHorizontal;
//_stackView中的子视图水平排列
_stackView.distribution = UIStackViewDistributionFill;
//让所有子视图填充满UIStackView的宽度
[label2 setContentHuggingPriority:100 forAxis:UILayoutConstraintAxisHorizontal];
//设置label2的拉伸优先级priority值越低优先级越高,所以_stackView会优先拉伸label2。
_stackView.alignment = UIStackViewAlignmentFill;
//让子视图的上下边界与_stackView上下边界对齐
_stackView.spacing = 5;
//子视图之间的间距为5
_stackView.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);
[self.view addSubview:_stackView];
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

示例效果 


上面的示例只是简单的介绍了UIStackView的基本用法合理的嵌套使用可以实现很多复杂的界面布局。


1
2

                        
                        
                         
推荐阅读
  • td{border:1pxsolid#808080;}参考:和FMX相关的类(表)TFmxObjectIFreeNotification ... [详细]
  • 【MySQL】frm文件解析
    官网说明:http:dev.mysql.comdocinternalsenfrm-file-format.htmlfrm是MySQL表结构定义文件,通常frm文件是不会损坏的,但是如果 ... [详细]
  • iOS如何实现手势
    这篇文章主要为大家展示了“iOS如何实现手势”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“iOS ... [详细]
  • Android 开发技巧:使用 AsyncTask 实现后台任务与 UI 交互
    本文详细介绍了如何在 Android 应用中利用 AsyncTask 来执行后台任务,并及时将任务进展反馈给用户界面,提高用户体验。 ... [详细]
  • 本文探讨了如何利用 Android 的 Movie 类来展示 GIF 动画,并详细介绍了调整 GIF 尺寸以适应不同布局的方法。同时,提供了相关的代码示例和注意事项。 ... [详细]
  • 本文分享了作者在使用LaTeX过程中的几点心得,涵盖了从文档编辑、代码高亮、图形绘制到3D模型展示等多个方面的内容。适合希望深入了解LaTeX高级功能的用户。 ... [详细]
  • 视觉Transformer综述
    本文综述了视觉Transformer在计算机视觉领域的应用,从原始Transformer出发,详细介绍了其在图像分类、目标检测和图像分割等任务中的最新进展。文章不仅涵盖了基础的Transformer架构,还深入探讨了各类增强版Transformer模型的设计思路和技术细节。 ... [详细]
  • 在Android中实现黑客帝国风格的数字雨效果
    本文将详细介绍如何在Android平台上利用自定义View实现类似《黑客帝国》中的数字雨效果。通过实例代码,我们将探讨如何设置文字颜色、大小,以及如何控制数字下落的速度和间隔。 ... [详细]
  • 尽管在WPF中工作了一段时间,但在菜单控件的样式设置上遇到了一些基础问题,特别是关于如何正确配置前景色和背景色。 ... [详细]
  • Android 中的布局方式之线性布局
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • Zabbix自定义监控与邮件告警配置实践
    本文详细介绍了如何在Zabbix中添加自定义监控项目,配置邮件告警功能,并解决测试告警时遇到的邮件不发送问题。 ... [详细]
  • egg实现登录鉴权(七):权限管理
    权限管理包含三部分:访问页面的权限,操作功能的权限和获取数据权限。页面权限:登录用户所属角色的可访问页面的权限功能权限:登录用户所属角色的可访问页面的操作权限数据权限:登录用户所属 ... [详细]
  • 实现Win10与Linux服务器的SSH无密码登录
    本文介绍了如何在Windows 10环境下使用Git工具,通过配置SSH密钥对,实现与Linux服务器的无密码登录。主要步骤包括生成本地公钥、上传至服务器以及配置服务器端的信任关系。 ... [详细]
  • 本报告记录了嵌入式软件设计课程中的第二次实验,主要探讨了使用KEIL V5开发环境和ST固件库进行GPIO控制及按键响应编程的方法。通过实际操作,加深了对嵌入式系统硬件接口编程的理解。 ... [详细]
  • 深入解析Unity3D游戏开发中的音频播放技术
    在游戏开发中,音频播放是提升玩家沉浸感的关键因素之一。本文将探讨如何在Unity3D中高效地管理和播放不同类型的游戏音频,包括背景音乐和效果音效,并介绍实现这些功能的具体步骤。 ... [详细]
author-avatar
微笑
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有