iOS9新特性——堆叠视图UIStackView(二)

简介: iOS9新特性——堆叠视图UIStackView

四、再来深入理解下UIStackView


       通过上面的介绍,我们已经基本了解了StackView的使用和特点,下面我们再来仔细介绍一下与其相关的属性和方法的使用,使我们能够更加得心应手。


有关被管理视图的添加与移除:


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

- (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);

在上面的例子中,我们设置了对其方式为充满,这样的话,我们就不需要再做过多控件尺寸的约束,如果我们被管理的控件高度或者宽度不一,我们可以设置中心对其,这样的话,我们还需要为每个控件添加一个宽度或者高度的约束,如下:


   NSMutableArray * array = [[NSMutableArray alloc]init];

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

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

       view.backgroundColor = [UIColor colorWithRed:arc4random()%255/255.0 green:arc4random()%255/255.0 blue:arc4random()%255/255.0 alpha:1];

       float height = arc4random()%90+10;

       [view mas_makeConstraints:^(MASConstraintMaker *make) {

           make.height.equalTo([NSNumber numberWithFloat:height]);

       }];

       [array addObject:view];

   }

   stackView = [[UIStackView alloc]initWithArrangedSubviews:array];

   [self.view addSubview:stackView];

   [stackView mas_makeConstraints:^(MASConstraintMaker *make) {

       make.centerX.equalTo(self.view.mas_centerX);

       make.centerY.equalTo(self.view.mas_centerY);

       make.leading.equalTo(self.view.mas_leading).offset(20);

       make.trailing.equalTo(self.view.mas_trailing).offset(-20);

       make.size.height.equalTo(@100);

   }];

   stackView.axis = UILayoutConstraintAxisHorizontal;

   stackView.distribution = UIStackViewDistributionFillEqually;

   stackView.alignment = UIStackViewAlignmentCenter;

效果如下:


image.png

 


这样,参差不齐的控件布局我们也可以轻松完成。


3.排列方式


@property(nonatomic) UIStackViewDistribution distribution;

排列方式的枚举如下:


typedef NS_ENUM(NSInteger, UIStackViewDistribution) {

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

   UIStackViewDistributionFill = 0,

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

   UIStackViewDistributionFillEqually,

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

   UIStackViewDistributionFillProportionally,

   //等间距排列

   UIStackViewDistributionEqualSpacing,

   //中心距离相等

   UIStackViewDistributionEqualCentering,

} NS_ENUM_AVAILABLE_IOS(9_0);

注意,除了我们选择fill属性时不需约束控件视图的尺寸,其他都需要进行约束,例如如果我们选择等间距,我把改成如下代码:


    [view mas_makeConstraints:^(MASConstraintMaker *make) {

           make.height.equalTo([NSNumber numberWithFloat:height]);

           make.width.equalTo(@50);

         

       }];

    stackView.distribution = UIStackViewDistributionEqualSpacing;

效果如下:

image.png




4.其他


//设置最小间距

@property(nonatomic) CGFloat spacing;

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

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

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

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

五、UIStackView的嵌套


       一个StackView不允许我们进行水平和竖直的交叉布局,但是我们可以通过嵌套的方式来实现复杂的布局效果,比如我们实现一个类似电影表标签,可以使用水平布局的StackView中嵌套一个竖直布局的StackView:


image.png


十分轻松就可以实现如下的效果:


image.png

 


看到了吧,通过StackView,我们没有添加过多的约束,使我们布局起来更加轻松了。如果你常常使用storyBoard进行开发,还有一个小技巧可以方便的将两个控件整合到一个StackView中,按住command,选中两个控件,之后点击右下角的如下图标,系统会自动帮我们生成一个StackView,将选中的两个控件整合进去,很酷吧!

目录
相关文章
|
安全 Android开发 iOS开发
探索安卓与iOS开发的差异:平台特性与用户体验的深度对比
在移动应用开发的广阔天地中,安卓和iOS两大平台各占半壁江山。本文旨在通过数据驱动的分析方法,深入探讨这两大操作系统在开发环境、用户界面设计及市场表现等方面的差异。引用最新的行业报告和科研数据,结合技术专家的观点,本文将提供对开发者和市场分析师均有价值的洞见。
|
安全 Android开发 iOS开发
安卓与iOS的较量:技术特性与用户体验的深度解析
在移动操作系统的战场上,安卓和iOS一直占据着主导地位。本文将深入探讨这两大平台的核心技术特性,以及它们如何影响用户的体验。我们将从系统架构、应用生态、安全性能和创新功能四个方面进行比较,帮助读者更好地理解这两个系统的异同。
376 30
|
Android开发 Swift iOS开发
探索Android与iOS开发的差异性:平台特性与用户体验的深度剖析
【7月更文挑战第27天】在移动应用开发的广阔天地中,Android和iOS两大阵营各自占据半壁江山。本文将深入探讨这两个平台在开发过程中的关键差异,从编程语言、工具集到用户界面设计原则,以及它们如何影响最终的用户体验。通过对比分析,我们将揭示每个平台的独特优势,并讨论如何在这些差异中寻找平衡点,以实现跨平台的成功。
|
安全 数据处理 Swift
深入探索iOS开发中的Swift语言特性
本文旨在为开发者提供对Swift语言在iOS平台开发的深度理解,涵盖从基础语法到高级特性的全面分析。通过具体案例和代码示例,揭示Swift如何简化编程过程、提高代码效率,并促进iOS应用的创新。文章不仅适合初学者作为入门指南,也适合有经验的开发者深化对Swift语言的认识。
347 9
|
数据安全/隐私保护 iOS开发 开发者
iOS 14隐私保护新特性深度解析####
随着数字时代的到来,隐私保护已成为全球用户最为关注的问题之一。苹果在最新的iOS 14系统中引入了一系列创新功能,旨在增强用户的隐私和数据安全。本文将深入探讨iOS 14中的几大隐私保护新特性,包括App跟踪透明度、剪贴板访问通知和智能防追踪功能,分析这些功能如何提升用户隐私保护,并评估它们对开发者和用户体验的影响。 ####
|
安全 定位技术 数据安全/隐私保护
深入探索iOS 15新特性:用户体验与隐私保护的革新
本文将深入探讨苹果公司最新操作系统iOS 15带来的创新功能,特别是那些对用户日常体验和数据隐私产生重大影响的特性。我们将重点分析FaceTime的新功能、通知管理的改进、以及隐私保护的增强措施,展示这些更新如何提升用户的生活质量和信息安全。
|
监控 Android开发 iOS开发
深入探索安卓与iOS的系统架构差异:理解两大移动平台的技术根基在移动技术日新月异的今天,安卓和iOS作为市场上最为流行的两个操作系统,各自拥有独特的技术特性和庞大的用户基础。本文将深入探讨这两个平台的系统架构差异,揭示它们如何支撑起各自的生态系统,并影响着全球数亿用户的使用体验。
本文通过对比分析安卓和iOS的系统架构,揭示了这两个平台在设计理念、安全性、用户体验和技术生态上的根本区别。不同于常规的技术综述,本文以深入浅出的方式,带领读者理解这些差异是如何影响应用开发、用户选择和市场趋势的。通过梳理历史脉络和未来展望,本文旨在为开发者、用户以及行业分析师提供有价值的见解,帮助大家更好地把握移动技术发展的脉络。
891 6
|
监控 开发工具 Android开发
探索安卓与iOS开发的差异:平台特性、工具和市场趋势
在移动应用开发的广阔舞台上,安卓与iOS两大操作系统扮演着主角。它们各自拥有独特的平台特性、开发工具和市场定位,这些差异深刻影响着开发者的决策和产品的最终形态。本文将深入分析这两大平台的关键技术差异,探讨各自的开发环境和工具集,以及它们在市场上的表现和未来的趋势,为开发者提供一个全面的视角,帮助他们在这两个平台上做出更明智的开发选择。
231 28
|
安全 Android开发 iOS开发
安卓与iOS的较量:技术特性与用户体验的深度剖析
在移动操作系统的战场上,安卓和iOS一直是两个重量级选手。本文将深入探讨两者的技术架构、安全性、应用生态以及用户体验等方面的差异,并尝试从用户和开发者的角度出发,分析这两个系统的优势与不足。通过比较,我们不仅能更好地理解各自的特点,还能洞察未来移动技术的发展趋势。
299 3
|
Android开发 Swift iOS开发
探索Android与iOS开发的差异:平台特性与用户体验
【7月更文挑战第30天】在移动应用开发的广阔天地中,Android与iOS两大平台各自展现出独特的魅力与挑战。本文将深入探讨这两个操作系统在开发环境、编程语言、用户界面设计以及发布流程等方面的主要差异,旨在为开发者提供一个清晰的对比视角,帮助他们根据项目需求和目标受众做出更明智的开发决策。
184 13