iOS9之UIStackView体验,无需任何约束,这才是真正的自动布局,快到不能呼吸

Apple在2012年推出AutoLayout,以前很排斥,现在用的飞起啊,2014年推出了Size Class,2015年又推出UIStackView,

他提供了一组接口用于平铺一行或者一列的的视图组合.对于嵌入StackView的视图,我们无需在进行任何约束了,UIKit

已经帮忙最好了一切约束布局,也就是能自动适应不同屏幕.而且你可以在一个StackView内嵌入多个StackView来完成

更为复杂的界面要求,简单来说,他节省了很大一部分时间给每个UI元素创建约束,它继承UIView,因此也会有很酷炫

的动画.

我知道你们肯定喜欢看会动的东西,但是人家只能上传2M的,各位见谅

这个也会动啊,先热热身

示例 1

示例 2

示例 3

看完图后来听我瞎BB几句

先看下面一组图

一般来讲用约束布局完之后,又来一个需求,需要在中间再插入一个控件,那么你肯定是这样的

咱们只能把原先的约束全部拆掉,然后重新插进新的约束,对于Autolayout没那么精通的我来说简直是要命啊!!!

OK ,今天来简单介绍下UIStackView的用途

StackView其实一个视图容器(需要注意的是,他是一个不会被渲染的UIView的子类,他和其他UIView不同,不会被渲染到

屏幕上,这意味着设置其BackgroundColor和重载drawReck:方法都不会产生任何效果),它会对它的子视图根据一定

规则自动布局,将子视图按栈的排列方式进行布局,并且有几个主要的属性

1.Alignment属性决定了Stack View如何沿它轴向的垂直方向摆放它的subview。对于一个垂直的Stack View,这个属性可以设置为Fill、Leading、Center和Trailing

Fill

Leading

Center

Trailing

2.Distribution属性决定了其子视图的分布比例

Fill:默认分布方式

Fill Equally:子视图的高度或宽度保持一致

Fill Proportionally:stackView自己计算出它认为合适的分布方式

Equal Spacing:子视图保持同等间隔的分布方式

Equal Cenerting:每个子视图中心线之间保持一致的分布方式

示例1分析

首先创建一个工程,在IB文件中右下角搜索StackView,会出现一个Horizontal和Vertical的两个控件,一个是水平一个垂直布局

我们要一个水平布局的测试下,拖进工程里面,上面已经提到不需要任何约束,但是需要给StackView设置如下约束

给StackView设置距左,距上,距右的间距,使其顶在屏幕上方

设置高度为SuperView的0.7倍

     

然后我们往StackView里面拖三个ImageView,每个ImageView的设置如下

再把StackView的参数设置为如下,注意看这里的黄色小箭头,有的话可以点进去看看什么错误,如果出现红色的箭

头那也点进去,可以选择自动修复或者根据提示更改,没有箭头才是正确的配置

根据提示修改之后没警告了,效果就出来了,我们根本不需要给单独的ImageView设置约束

上层图片已经完成了,咱们再加点文字什么的,现在先不拖UIStackView,先拖两个UILabel,一个显示名字在上面,

一个现实描述在下面,拖完之后咱们同事按住Command选中两者,然后按下右下角的栈堆视图控制快捷键,他们就被

加入一个UIStackView管理了(如果要解散这个Stack,请先选择需要解散的Stack,然后按住ALT +  鼠标左键,点击

Unembed即可),默认是垂直的,然后继续选择StackView的属性Axis(方向),Alignment(对齐方式),

Distrubution(填充方式),Spcaing(间隙)进行布局

上图已经有一个Stack了,咱们现在要做的就是再嵌套一个,看下图示例

那么再嵌套一个也是一样的套路,拖到想要的位子就好了 ,总体结构如下

正如你所看到的,我们只需要拖动UIStackView(仅仅设置容器的约束就好),里面的空间只要设置他的几个属性值就

能达到精确布局,省去了单个UI空间的约束设置,经过我的加了点代码,还能实现简

单的动画

@property (weak, nonatomic) IBOutlet UIImageView *imageView1;
@property (weak, nonatomic) IBOutlet UIImageView *imageView2;
@property (weak, nonatomic) IBOutlet UIImageView *imageView3;
@property (nonatomic,assign) BOOL isLarge;
- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.
    self.title = @"Command + →或者点图片有动画";
    for (NSInteger i = 0; i < 3 ; i ++)
    {
        UIImageView *imageView = [self valueForKey:[NSString stringWithFormat:@"imageView%zd",i + 1]];
        UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(clickImageView:)];
        imageView.userInteractionEnabled = YES;
        [imageView addGestureRecognizer:tap];
    }
}

- (void)clickImageView:(UITapGestureRecognizer *)tap
{
    long long tag = tap.view.tag;
    self.isLarge = !self.isLarge;
    switch (tag) {
        case 1000:
            if (!self.isLarge)
            {
                [UIView animateWithDuration:0.5 animations:^{

                    self.imageView2.hidden = NO;
                    self.imageView3.hidden = NO;
                }];
            }
            else
            {
                [UIView animateWithDuration:0.5 animations:^{

                    self.imageView2.hidden = YES;
                    self.imageView3.hidden = YES;
                }];
            }

            break;
        case 1001:
            if (!self.isLarge)
            {
                [UIView animateWithDuration:0.5 animations:^{

                    self.imageView1.hidden = NO;
                    self.imageView3.hidden = NO;
                }];
            }
            else
            {
                [UIView animateWithDuration:0.5 animations:^{

                    self.imageView1.hidden = YES;
                    self.imageView3.hidden = YES;
                }];
            }

            break;
        case 1002:
            if (!self.isLarge)
            {
                [UIView animateWithDuration:0.5 animations:^{

                    self.imageView2.hidden = NO;
                    self.imageView1.hidden = NO;
                }];
            }
            else
            {
                [UIView animateWithDuration:0.5 animations:^{

                    self.imageView2.hidden = YES;
                    self.imageView1.hidden = YES;
                }];
            }

            break;

        default:
            break;
    }
}

正常的时候

横过来(CMD + →)

    第一个Demo差不多就这样,大家可以去试试,非常容易

示例2分析

通过UIStackView给UITableView布局cell

创建一个UIImageView    一个UILabel   一个UIButton

给这三个东西集合成一个UIStackView   给Stack设置好约束的时候,竟然出现红色警告

                                        

当时我真的慌了,经过我不泄努力

先看警告图

决定StackView如何将它的子视图沿轴向分布的属性是他的distribution属性。当这个属性默认是Fill的时候,子空间会

填充满整个容器,StackView会拉伸其中一个使其充满整个屏幕,尤其是水平内容优先级较低的空间,如果全部一样

的优先级,那么默认伸缩第一个控件,就和上面的图一样,左侧图片被拉伸了

下图所示,上面那个是内容吸附,下面的是抗压阻力,越高就越不容易被外界约束破坏控件的内容

具体请见 Hugging priority和compressing resistance priority的图解

这三个空间默认都是251 和 750,我们改成这样左 中 右分别是 ImageView    UILabel    UIButton

               

运行起来的效果图

效果不是你想要的???

好吧,咱们把UIImageView和UIButton的优先级对掉下 图片顺序是 UIImageView  UILabel  UIButton对应的优先级

        

再运行

这回满意了吧!!!

示例3就不解释了,基本是一个套路,看完上面两个可以简单玩玩示例3的效果.博主智商

有限,只能给出简单的Demo,各位脑洞大开可以再自己去试试其他的

参考老外的一个文章:点击打开链接

本文Demo地址:UIStackView的Demo链接

Over~~~~~~

时间: 2024-10-10 15:42:23

iOS9之UIStackView体验,无需任何约束,这才是真正的自动布局,快到不能呼吸的相关文章

ios9中 UIStackView的使用

ios9中 UIStackView的使用 by 伍雪颖 UIStackView可以垂直或水平排布多个subview, 自动为每个subview创建和添加Auto Layout constraints. 1.添加subview let logoImage:UIImageView = UIImageView(image: UIImage(named: "logo")) logoImage.contentMode = .ScaleAspectFit self.stackView.addArr

iOS9 新增 UIStackView 官方文档翻译

一.继承关系.遵守协议.隶属框架及可用平台 UIStackView 类提供了一个高效的接口用于平铺一行或一列的视图组合.Stack视图使你依靠自动布局的能力,创建用户接口使得可以动态的调整设备朝向.屏幕尺寸及任何可用范围内的变化.Stack视图管理着所有在它的 arrangedSubviews 属性中的视图的布局.这些视图根据它们在 arrangedSubviews 数组中的顺序沿着 Stack 视图的轴向排列.精确的布局变量根据 Stack 视图的 axis, distribution, al

体验了Sublime + Emmet,才体会到原来前端开发可以这么痛快!

从当初用notepad写出第一个web页面,到现在偶尔使用Editplus做一些HTML5的消遣,不知不觉已经15年了  --! 在这中间,和那些老顽固一样,坚决远离FP.DW那些半自动的前端开发工具 虽说效率确实差了些,但那种每一个字符都掌握在自己手中的踏实感实在是不忍心放弃 直到遇见Sublime,和Emmet,才知道,原来纯手打也可以这么痛快淋漓! 就像这样: 然后Tab,就会变成这样: 继续,在body中间,就像这样: 然后Tab,就会变成这样: 又或者,这样: 然后Tab,就会变成这样

51CTO订阅专栏小程序上线了,首次体验还有24元无门槛礼包相送,快来体验吧~~

订了专栏在那看?在PC?在H5?还是在服务号? 现在你又多了一个选择,那就是51CTO订阅专栏微 信小程序. 全新的页面,全新的阅读体验: 首次体验小程序有小程序新人礼包相送: 还在等什么,赶紧掏出手机,扫描下方二维码,体现小程序带来的阅读乐趣吧: 原文地址:http://blog.51cto.com/51ctoblog/2176029

对约束的视图约束变化动画处理

有时候我们为了用户体验需要对约束的视图执行动画, 如下: [UIView animateWithDuration:0.3 animations:^{ self.mButtomViewLayoutH.constant =  44; [self.mButtomView setNeedsLayout]; }]; 对self.mButtomView执行0.3秒的动画, 运行发现, 然并卵!  那怎么解决呢? 继续看... 原因在于你设置完视图后并没有通知父视图刷新约束. 所以你如下设置OK. [UIVi

我理解的用户体验

用户体验是什么? 用起来很爽快.这就是用户体验. 用户体验是一系列的心理学,美学,经验总结而成的一门艺术. 专用名称是UED User Experience Design(用户体验设计) 用户体验不是产品的易用性. 有一些很好用但是非常让人难受的东西,比如说"高速公路"跟"弯路". 高速公路是有效直达的,路程速度上都是完美的,但是开车走高速是非常乏味的.这就是易用性很高,但是体验很糟糕. 用户体验不是我们的体验,而是用户的体验. 每个人因为学识,经验,人生阅历,习惯

[Oracle]约束(constraint)

(一)约束的概念 在Oracle中,可以通过设置约束来防止无效数据进入表中.Oracle一共有5种约束: 主键约束(primary key) 外键约束(foreign key) 唯一性约束(unique) 非空约束(not null) 检查约束(check) (1)主键约束 --主键约束可以定义在一列或多列上,值具有唯一性.非空性: --在一个表上只能定义一个主键约束: --Oracle会自定在主键约束的列上创建唯一性索引,可以指定唯一性索引的位置及存储参数. (2)外键约束 --外键约束列的取

载]mysqlhotcopy 热备工具体验与总结

载]mysqlhotcopy 热备工具体验与总结 今天有空尝试了一下MYSQLHOTCOPY这个快速热备MYISAM引擎的工具.(本文是针对单个服务器的情况,以后将会加入多服务器相关操作)他和MYSQLDUMP的比较:1.前者是一个快速文件意义上的COPY,后者是一个数据库端的SQL语句集合.2.前者只能运行在数据库目录所在的机器上,后者可以用在远程客户端.3.相同的地方都是在线执行LOCK TABLES 以及 UNLOCK TABLES4.前者恢复只需要COPY备份文件到源目录覆盖即可,后者需

周鸿祎:需格外注意的五点用户体验

技术人员出身的产品经理非常有潜力,因为他懂技术,跟技术人员能更好的挑选技术方案.但我看到很多技术人员在做产品中犯的一个共同错误,太想要把自己的技术展现给用户,把先进的技术概念给用户. 这就是忘了从用户角度出发,用户到今天,特别是体验时代,什么叫体验时代?在电脑还是即刻时代的时候,电脑越复杂越好,能够输入复杂的指令,但是当一个产业,比如今天苹果都成了街机,电脑已经成了标配情况下,电脑从专家时代进入到大众时代,这时候体验就变得更加重要,用户甚至都不知道苹果用了什么CPU,很多拿苹果的白富美.高富帅不