autolayout_masonry介绍与使用实践:快速上手autolayout - CSDN
  • AutoLayout(自动布局)入门

    千次阅读 2013-11-29 11:07:27
    AutoLayout在去年的WWDC上被引入Cocoa,而在今年的WWDC上,Apple不惜花费了三个Session的前所未见的篇幅来详细地向开发者讲解AutoLayout在iOS上的应用,是由起原因的:iPhone5的屏幕将变为4寸,开发者即将面临为...

    这是WWDC2012笔记系列中的一篇,完整的笔记列表可以参看这里。如果您是首次来到本站,也许您会有兴趣通过RSS的方式订阅本站。 AutoLayout在去年的WWDC上被引入Cocoa,而在今年的WWDC上,Apple不惜花费了三个Session的前所未见的篇幅来详细地向开发者讲解AutoLayout在iOS上的应用,是由起原因的:iPhone5的屏幕将变为4寸,开发者即将面临为不同尺寸屏幕进行应用适配的工作。Android平台开发中最令人诟病的适配工作的厄运现在似乎也将降临在iOS开发者的头上。基于这样的情况,Apple大力推广使用AutoLayout的方法来进行UI布局,以一举消除适配的烦恼。AutoLayout将是自Interface Builder和StoryBoard之后UI制作上又一次重要的变化,也必然是之后iOS开发的趋势,因此这个专题很值得学习。

    AutoLayout是什么?

    使用一句Apple的官方定义的话
    AutoLayout是一种基于约束的,描述性的布局系统。 Auto Layout Is a Constraint-Based, Descriptive Layout System.
    关键词:
    • 基于约束 - 和以往定义frame的位置和尺寸不同,AutoLayout的位置确定是以所谓相对位置的约束来定义的,比如x坐标为superView的中心,y坐标为屏幕底部上方10像素
    • 描述性 - 约束的定义和各个view的关系使用接近自然语言或者可视化语言(稍后会提到)的方法来进行描述
    • 布局系统 - 即字面意思,用来负责界面的各个元素的位置。
    总而言之,AutoLayout为开发者提供了一种不同于传统对于UI元素位置指定的布局方法。以前,不论是在IB里拖放,还是在代码中写,每个UIView都会有自己的frame属性,来定义其在当前视图中的位置和尺寸。使用AutoLayout的话,就变为了使用约束条件来定义view的位置和尺寸。这样的最大好处是一举解决了不同分辨率和屏幕尺寸下view的适配问题,另外也简化了旋转时view的位置的定义,原来在底部之上10像素居中的view,不论在旋转屏幕或是更换设备(iPad或者iPhone5或者以后可能出现的mini iPad)的时候,始终还在底部之上10像素居中的位置,不会发生变化。 总结
    使用约束条件来描述布局,view的frame会依据这些约束来进行计算 Describe the layout with constraints, and frames are calculated automatically.

    AutoLayout和Autoresizing Mask的区别

    Autoresizing Mask是我们的老朋友了…如果你以前一直是代码写UI的话,你肯定写过UIViewAutoresizingFlexibleWidth之类的枚举;如果你以前用IB比较多的话,一定注意到过每个view的size inspector中都有一个红色线条的Autoresizing的指示器和相应的动画缩放的示意图,这就是Autoresizing Mask。在iOS6之前,关于屏幕旋转的适配和iPhone,iPad屏幕的自动适配,基本都是由Autoresizing Mask来完成的。但是随着大家对iOS app的要求越来越高,以及已经以及今后可能出现的多种屏幕和分辨率的设备来说,Autoresizing Mask显得有些落伍和迟钝了。AutoLayout可以完成所有原来Autoresizing Mask能完成的工作,同时还能够胜任一些原来无法完成的任务,其中包括:
    • AutoLayout可以指定任意两个view的相对位置,而不需要像Autoresizing Mask那样需要两个view在直系的view hierarchy中。
    • AutoLayout不必须指定相等关系的约束,它可以指定非相等约束(大于或者小于等);而Autoresizing Mask所能做的布局只能是相等条件的。
    • AutoLayout可以指定约束的优先级,计算frame时将优先按照满足优先级高的条件进行计算。
    总结
    Autoresizing Mask是AutoLayout的子集,任何可以用Autoresizing Mask完成的工作都可以用AutoLayout完成。AutoLayout还具备一些Autoresizing Mask不具备的优良特性,以帮助我们更方便地构建界面。

    AutoLayout基本使用方法

    Interface Builder

    最简单的使用方法是在IB中直接拖。在IB中任意一个view的File inspector下面,都有Use Autolayout的选择框(没有的同学可以考虑升级一下Xcode了=。=),钩上,然后按照平常那样拖控件就可以了。拖动控件后在左边的view hierarchy栏中会出现Constraints一向,其中就是所有的约束条件。 
    选中某个约束条件后,在右边的Attributes inspector中可以更改约束的条件,距离值和优先度等:  
    对于没有自动添加的约束,可以在IB中手动添加。选择需要添加约束的view,点击菜单的Edit->Pin里的需要的选项,或者是点击IB主视图右下角的按钮,即可添加格外的约束条件。 可视化的添加不仅很方便直观,而且基本不会出错,是优先推荐的添加约束的方式。但是有时候只靠IB是无法完成某些约束的添加的(比如跨view hierarchy的约束),有时候IB添加的约束不能满足要求,这时就需要使用约束的API进行补充。

    手动使用API添加约束

    创建

    iOS6中新加入了一个类:NSLayoutConstraint,一个形如这样的约束
    • item1.attribute = multiplier ⨉ item2.attribute + constant
    对应的代码为
    1 [NSLayoutConstraint constraintWithItem:button
    2                              attribute:NSLayoutAttributeBottom
    3                              relatedBy:NSLayoutRelationEqual
    4                                 toItem:superview
    5                              attribute:NSLayoutAttributeBottom
    6                             multiplier:1.0
    7                               constant:-padding]
    这对应的约束是“button的底部(y) = superview的底部 -10”。

    添加

    在创建约束之后,需要将其添加到作用的view上。UIView(当然NSView也一样)加入了一个新的实例方法:
    • -(void)addConstraint:(NSLayoutConstraint *)constraint;
    用来将约束添加到view。在添加时唯一要注意的是添加的目标view要遵循以下规则:
    • 对于两个同层级view之间的约束关系,添加到他们的父view上
     
    • 对于两个不同层级view之间的约束关系,添加到他们最近的共同父view上
     
    • 对于有层次关系的两个view之间的约束关系,添加到层次较高的父view上
     

    刷新

    可以通过-setNeedsUpdateConstraints和-layoutIfNeeded两个方法来刷新约束的改变,使UIView重新布局。这和CoreGraphic的-setNeedsDisplay一套东西是一样的~

    Visual Format Language 可视格式语言

    UIKit团队这次相当有爱,估计他们自己也觉得新加约束的API名字太长了,因此他们发明了一种新的方式来描述约束条件,十分有趣。这种语言是对视觉描述的一种抽象,大概过程看起来是这样的: accept按钮在cancel按钮右侧默认间距处 
     
     
     
    最后使用VFL(Visual Format Language)描述变成这样:
    1 [NSLayoutConstraint constraintsWithVisualFormat:@\\"[cancelButton]-[acceptButton]\\"
    2                                         options:0
    3                                         metrics:nil
    4                                           views:viewsDictionary];
    其中viewsDictionary是绑定了view的名字和对象的字典,对于这个例子可以用以下方法得到对应的字典:
    1 UIButton *cancelButton = ...
    2 UIButton *acceptButton = ...
    3 viewsDictionary = NSDictionaryOfVariableBindings(cancelButton,acceptButton);
    生成的字典为
    { acceptButton = ""; cancelButton = ""; } 
    当然,不嫌累的话自己手写也未尝不可。现在字典啊数组啊写法相对简化了很多了,因此也不复杂。关于Objective-C的新语法,可以参考我之前的一篇WWDC 2012笔记:WWDC 2012 Session笔记——405 Modern Objective-C。 在view名字后面添加括号以及连接处的数字可以赋予表达式更多意义,以下进行一些举例:
    • [cancelButton(72)]-12-[acceptButton(50)]
      • 取消按钮宽72point,accept按钮宽50point,它们之间间距12point
    • [wideView(>=60@700)]
      • wideView宽度大于等于60point,该约束条件优先级为700(优先级最大值为1000,优先级越高的约束越先被满足)
    • V:[redBox][yellowBox(==redBox)]
      • 竖直布局,先是一个redBox,其下方紧接一个宽度等于redBox宽度的yellowBox
    • H:|-[Find]-[FindNext]-[FindField(>=20)]-|
      • 水平布局,Find距离父view左边缘默认间隔宽度,之后是FindNext距离Find间隔默认宽度;再之后是宽度不小于20的FindField,它和FindNext以及父view右边缘的间距都是默认宽度。(竖线'|‘ 表示superview的边缘)

    容易出现的错误

    因为涉及约束问题,因此约束模型下的所有可能出现的问题这里都会出现,具体来说包括两种:
    • Ambiguous Layout 布局不能确定
    • Unsatisfiable Constraints 无法满足约束
    布局不能确定指的是给出的约束条件无法唯一确定一种布局,也即约束条件不足,无法得到唯一的布局结果。这种情况一般添加一些必要的约束或者调整优先级可以解决。无法满足约束的问题来源是有约束条件互相冲突,因此无法同时满足,需要删掉一些约束。两种错误在出现时均会导致布局的不稳定和错误,Ambiguous可以被容忍并且选择一种可行布局呈现在UI上,Unsatisfiable的话会无法得到UI布局并报错。 对于不能确定的布局,可以通过调试时暂停程序,在debugger中输入
    • po [[UIWindow keyWindow] _autolayoutTrace]
    来检查是否存在Ambiguous Layout以及存在的位置,来帮助添加条件。另外还有一些检查方法,来查看view的约束和约束状态:
    • [view constraintsAffectingLayoutForOrientation/Axis: NSLayoutConstraintOrientationHorizontal/Vertical]
    • [view hasAmbiguousLayout]
      • [view exerciseAmbiguityInLayout]

    布局动画

    动画是UI体验的重要部分,更改布局以后的动画也非常关键。说到动画,Core Animation又立功了..自从CA出现以后,所有的动画效果都非常cheap,在auto layout中情况也和collection view里一样,很简单(可以参考WWDC 2012 Session笔记——219 Advanced Collection Views and Building Custom Layouts),只需要把layoutIfNeeded放到animation block中即可~
    1 [UIView animateWithDuration:0.5 animations:^{
    2     [view layoutIfNeeded];
    3 }];
    如果对block不熟悉的话,可以看看我很早时候写的一篇block的文章
    展开全文
  • AutoLayout

    2018-07-25 07:55:06
    //屏幕适配AutoLayout //1、添加依赖 implementation 'com.zhy:autolayout:1.4.3' //2、在清单文件中注明你要设计的初始屏幕尺寸 <meta-data android:name="design_width" android:value="...

    //屏幕适配AutoLayout
    //1、添加依赖
    implementation 'com.zhy:autolayout:1.4.3'
    //2、在清单文件中注明你要设计的初始屏幕尺寸
    <meta-data
    android:name="design_width"
    android:value="1080" />
    <meta-data
    android:name="design_height"
    android:value="1920" />
    //3、
    //第一种:
    //让你的Activity继承AutoLayoutActivity(可以在布局中直接写px,不用再担心去换算dp的问题了)
    //第二种:(建议使用)
    //如果你不希望继承AutoLayoutActivity,可以在编写布局文件时,将
    //LinearLayout -> AutoLinearLayout
    //RelativeLayout -> AutoRelativeLayout
    //FrameLayout -> AutoFrameLayout
    //这样也可以完成适配。


    GItHub直通车:   https://github.com/hongyangAndroid/AndroidAutoLayout

    展开全文
  • Auto Layout 进阶

    万次阅读 2014-10-31 12:04:30
    引言: Auto Layout是iOS6发布后引入的一个全新的布局特性,其目的是弥补以往autoresizing在布局方面的不足之处,以及未来面对更多尺寸适配时界面布局可以更好的适应. 要完全掌握Auto Layout是一件非常消耗精力的事情,...

    引言:

    Auto Layout是iOS6发布后引入的一个全新的布局特性,其目的是弥补以往autoresizing在布局方面的不足之处,
    以及未来面对更多尺寸适配时界面布局可以更好的适应.
    要完全掌握Auto Layout是一件非常消耗精力的事情,需要大量的实践,并且在根本上面,理解其如何使用,
    如果要全面的介绍Auto Layout和使用场景估计几篇博文都介绍不完,
    本文希望能将使用Auto Layout的重点和技巧以及注意事项,进行一个介绍.成为学习Auto Layout的一个导航文章.



    参考资料:

    1:iOS7.0 Xcode5 Auto Layout 备忘录

    http://www.cnblogs.com/thefeelingofsimple/p/3316300.html

    2:iOS 6 Auto Layout NSLayoutConstraint 界面布局

    http://www.devdiv.com/iOS_6_Auto_Layout_NSLayoutConstraint_%E7%95%8C%E9%9D%A2%E5%B8%83%E5%B1%80-weblog-227936-13173.html

    3:iOS 6 新特性 Auto Layout

    http://www.cocoachina.com/bbs/read.php?tid=116558

    4:WWDC 2012 Session笔记——202, 228, 232 AutoLayout(自动布局)入门

    http://onevcat.com/2012/09/autoayout/

    5:iOS 6 自动布局 入门-1

    http://www.raywenderlich.com/zh-hans/22873/ios-6-%E8%87%AA%E5%8A%A8%E5%B8%83%E5%B1%80-%E5%85%A5%E9%97%A8%EF%BC%8D1

    6:先进的自动布局工具箱

    http://answerhuang.duapp.com/index.php/2013/10/11/%E5%85%88%E8%BF%9B%E7%9A%84%E8%87%AA%E5%8A%A8%E5%B8%83%E5%B1%80%E5%B7%A5%E5%85%B7%E7%AE%B1/

    7:AutoLayout 相关概念介绍和动画demo

    http://studentdeng.github.io/blog/2014/06/13/auto-layout/

    8:iOS中AutoLayer自动布局流程及相关方法

    http://my.oschina.net/w11h22j33/blog/208574




    使用:


    1:理解概念

    Auto Layout中文翻译过来意思是自动布局,通过内定的Constraint(约束)和各项条件来计算出合理的布局.而这个合理的布局,符合我们的的预期和意图.

    将我们想象中的结果展现出来.Constraint的设定非常灵活,实现一种布局的方法可以通过多Constraint套来完成.

    以下几点是我们在开始使用之前必须弄清楚的事情:

    1:我们要抛弃以往旧的布局方式不再去关注View的Frame,Center,和autoresizing. 因为这些坐标和大小的定位都可以通过来Auto Layout完成.

    2:理解每一种Constraint的含义,否则,当你去看别人的实现的Constraint时,就会有种看天书的感觉.

    3:按意图设计,一切按我们理想中的效果去布局,只要约束设定的合理,就一定能够完成目标布局.


    2:开始使用

    先从Interface Builder开始吧. 打开某个Xib或者StoryBoard,
    在右侧Show in file inspector里面找到Ues Autolayout,将其勾选.如下图:


    自此,Autolayout便启用成功,autoresizingMask被废弃.其所有以往的功能和特性都被Autolayout取代.


    现在我们定位控件位置的方式,不再像以前一样,计算好每一个控件具体的位置,x是多少,y是多少.
    而是思考,这个控件离左边是相隔多少距离,或者离顶部或底部相隔多少距离.
    而有些规则性的事情还是类似的,比如我们定位一个控制的位置,一定要有x,y两个坐标点同时有值,少一个都不能正常显示.
    同样Autolayout在创建约束时也一样,在思考完离顶部距离以后,还需要思考离顶部距离,否则控件的显示位置一样无法正常显示.
    换言之,要让Autolayout计算出合理的位置,需要保证水平距离和垂直距离同时存在. 否则IDE,都会给出警告,提示这样的布局Ambiguous Layout(模凌两可)


    接下来,让我们来熟悉一下Interface Builder提供哪些实现Autolayout的功能:
    观察一下界面预览右下角,有一排如下图这样的按钮:


    这些是Interface Builder用来创建Constraint的主要方式,同时,我们也可以在Xcode的菜单栏中找到这些功能,如下图:


    这些功能分别如下图中描述的那样:




    如果是从代码层面开始使用Autolayout,需要对使用的ViewtranslatesAutoresizingMaskIntoConstraints的属性设置为NO.
    即可开始通过代码添加Constraint,否则View还是会按照以往的autoresizingMask进行计算.
    而在Interface Builder中勾选了Ues Autolayout,IB生成的控件的translatesAutoresizingMaskIntoConstraints属性都会被默认设置NO.





    3:从旧的IB布局中转换成Auto layout



    4:熟练使用Interface Builder



    5:通过代码来构建自动布局

    代码创建的约束有两种方式:

    1:常规约束,写法非常冗长,但能实现所有的约束方式以及非常特殊的约束方式,代码如下:

    //实例化Button
    button1 = [[UIButton alloc] initWithFrame:(CGRectZero)];//这里不再需要去刻意指定x.y等坐标.
    [button1 setTitle:@"yushuyi" forState:UIControlStateNormal];
    [button1 setBackgroundColor:[UIColor redColor]];
    [button1 sizeToFit];
    [button1 setTranslatesAutoresizingMaskIntoConstraints:NO];//将使用AutoLayout的方式来布局
    [self.view addSubview:button1];
    
    
    //创建了一个水平居中父视图的约束
    NSLayoutConstraint *constraint = [
                                      NSLayoutConstraint
                                      constraintWithItem:button1
                                      attribute:NSLayoutAttributeCenterX
                                      relatedBy:NSLayoutRelationEqual
                                      toItem:self.view
                                      attribute:NSLayoutAttributeCenterX
                                      multiplier:1.0f
                                      constant:00.0f
                                      ];
    
    [self.view addConstraint:constraint];//将约束添加到对应的父视图中
    
    //继续创建了一个位于父视图底部相隔20距离的约束
    constraint = [
                  NSLayoutConstraint
                  constraintWithItem:button1
                  attribute:NSLayoutAttributeBottom
                  relatedBy:NSLayoutRelationEqual
                  toItem:self.view
                  attribute:NSLayoutAttributeBottom
                  multiplier:1.0f
                  constant:-20.0f
                  ];
    
    [self.view addConstraint:constraint];
    
    值得注意的是,添加约束之前一定要将子视图优先addSubview到父视图中,否则在添加约束时会产生编译器警告.
    而我们在理解的时候,可以通过这种方式来理解.

    item1.attribute = multiplier ⨉ item2.attribute + constant


    2:可视化格式语言约束

    所谓可视化格式语言约束,是一种很直观的理解方式,当然,前提是你已经熟练理解这套语言的规则.

    通过可视化语言可以一次性创建多个约束. 这对于第一次方式来说,是相当方面和容易理解的.但可视化语言不是所有约束都能满足.

    我们可以用正则表达式的学习方式来学习这项可视化格式语言.举例代码如下:

    //创建需要参与约束规则的对象字典 <span style="font-family:Arial,Helvetica,sans-serif">表示这三个Button将参与Autolayout的约束处理</span>
    NSDictionary *viewsDic = NSDictionaryOfVariableBindings(deleteButton,cancelButton,nextButton);
    
    NSArray *constraints = nil;
    constraints = [NSLayoutConstraint constraintsWithVisualFormat:
      @"H:|-25-[deleteButton(==cancelButton@700)]-(>=8)-[cancelButton(140)]-[nextButton(nextButtonWidth)]-rectY-|"//水平 可视化格式语言
                   options:NSLayoutFormatAlignAllTop //对齐功能
                   metrics:@{@"rectY":@5,@"nextButtonWidth":@30}//指标参数
                   views:viewsDic];//参与约束的对象字典
    [self.view addConstraints:constraints];
    
    constraints = [NSLayoutConstraint constraintsWithVisualFormat:
                   @"V:[nextButton]-|" //垂直 可视化格式语言
                   options:0 //无条件
                   metrics:nil//不带指标参数
                     views:viewsDic];//参与约束的对象字典
    
    [self.view addConstraints:constraints];
    
    //    [deleteButton setContentHuggingPriority:249 forAxis:UILayoutConstraintAxisHorizontal];

    这简单的十行代码,如果你没有学习过Autolayout也会看出一些猫腻,似乎看懂了.但又似懂非懂.接下来就详细解释一下
    在解释之前,先看看上面这些代码执行后的效果,竖屏如下图:


    横屏:


    三个按钮位于视图的底部,有大有小,中间有间隔.



    3:通过第三方Auto Layout的增强类别包,来实现约束的创建

    https://github.com/smileyborg/UIView-AutoLayout

    UIView-AutoLayout的出现如作者所说,其实现思路来源于Interface Builder. 所以在其API命名方面可以找到很多Interface Builder的影子,

    博主极力推荐这个类库,通过它来创建约束是一件非常愉快的事情,思路清晰,当有个前提是,你已经理解了Auto Layout各项规则.



    constraintsAffectingLayoutForAxis //约束检查 为什么这个View 这样显示


    systemLayoutSizeFittingSize

    http://stackoverflow.com/questions/19352882/tableviewheightforrowatindexpath-incorrect-reporting-content-view-size-with-au


    6:调试:

    看懂IB给出的警告:


    通过代码来检测 模凌两可的布局:



    7:Autolayout 特例场景:


    8:Autolayout 布局流程:



    总结:




    展开全文
  • autolayout.jar

    2020-07-19 23:33:04
    用于自动生成多个分辨率的values文件(特殊需求,通过命令行指定即可,详见https://blog.csdn.net/qq941263013/article/details/80937717) 双击即可使用
  • iOS开发之 Autolayout 详解

    千次阅读 2018-05-24 16:55:11
    iOS开发之 Autolayout 详解 1. 概述 Autolayout 是 Apple 自 iOS6 开始引入的旨在解决不同屏幕之间布局适配的技术 苹果官方推荐开发者使用 Autolayout 进行UI界面的布局 Autolayout 有两个核心概念:1. 参照...

    iOS开发之 Autolayout 详解

    2018-05-24-1_HemKn1OC2bh7tUpK7_p0Ng

    1. 概述

    1. Autolayout 是 Apple 自 iOS6 开始引入的旨在解决不同屏幕之间布局适配的技术
    2. 苹果官方推荐开发者使用 Autolayout 进行UI界面的布局
    3. Autolayout 有两个核心概念:1. 参照。 2. 约束
    4. 使用Autolayout的注意点:
      1. 添加约束之前需要保证控件已被添加到父控件中
      2. 不需要再给View设置frame
      3. 禁止 autoresizing 功能。

    2. 代码实现 Autolayout

    2.1 步骤:

    1. 把 View 添加到父控件上。
    2. 添加约束到相应的 View 上。

      - (void)addConstraint:(NSLayoutConstraint *)constraint;
      - (void)addConstraints:(NSArray<__kindof NSLayoutConstraint *> *)constraints;
    3. 自动布局核心公式:
      obj1.property1 =(obj2.property2 * multiplier)+ constant value
    NSLayoutConstraint
    /**
    view1 :要约束的控件
    attr1 :约束的类型(做怎样的约束)
    relation :与参照控件之间的关系
    view2 :参照的控件
    attr2 :约束的类型(做怎样的约束)
    multiplier :乘数
    c :常量
    */
    + (instancetype)constraintWithItem:(id)view1 attribute:(NSLayoutAttribute)attr1 relatedBy:(NSLayoutRelation)relation toItem:(id)view2 attribute:(NSLayoutAttribute)attr2 multiplier:(CGFloat)multiplier constant:(CGFloat)c;

    2.2 实例

    添加一个左间距100 上间距200,宽150 高64 的红视图:
    - (void)testAutolayout1 {
        UIView *redV = [[UIView alloc] init];
        redV.backgroundColor = [UIColor redColor];
        redV.translatesAutoresizingMaskIntoConstraints = NO;
        [self.view addSubview:redV];
        /**
         view1 :要约束的控件
         attr1 :约束的类型(做怎样的约束)
         relation :与参照控件之间的关系
         view2 :参照的控件
         attr2 :约束的类型(做怎样的约束)
         multiplier :乘数
         c :常量
         */
        /// 左间距100:
        NSLayoutConstraint *consLeft = [NSLayoutConstraint constraintWithItem:redV attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeLeft multiplier:1.0 constant:100];
        [self.view addConstraint:consLeft];
    
        /// 上间距200:
        NSLayoutConstraint *consTop = [NSLayoutConstraint constraintWithItem:redV attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeTop multiplier:1.0 constant:200];
        [self.view addConstraint:consTop];
    
        /// 宽150:
        NSLayoutConstraint *consWidth = [NSLayoutConstraint constraintWithItem:redV attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeWidth multiplier:1.0 constant:150];
        [redV addConstraint:consWidth];
    
        /// 高64:
        NSLayoutConstraint *consHeight = [NSLayoutConstraint constraintWithItem:redV attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeHeight multiplier:1.0 constant:64];
        [redV addConstraint:consHeight];
    }
    在上视图基础上添加一个与红视图右间距相同,高度相同,顶部距离红色视图间距20,宽度为红色视图一半的蓝色View
     UIView *blueV = [[UIView alloc] init];
        blueV.backgroundColor = [UIColor blueColor];
        blueV.translatesAutoresizingMaskIntoConstraints = NO;
        [self.view addSubview:blueV];
    
        /// 和 redV 右间距为0
        NSLayoutConstraint *b_consRight = [NSLayoutConstraint constraintWithItem:blueV attribute:NSLayoutAttributeRight relatedBy:NSLayoutRelationEqual toItem:redV attribute:NSLayoutAttributeRight multiplier:1.0 constant:0.0];
        [self.view addConstraint:b_consRight];
    
        /// 和 redV 等高
        NSLayoutConstraint *b_consHeight = [NSLayoutConstraint constraintWithItem:blueV attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:redV attribute:NSLayoutAttributeHeight multiplier:1.0 constant:0.0];
        [self.view addConstraint:b_consHeight];
    
        /// 宽度是 redV 的一半
        NSLayoutConstraint *b_consWidth = [NSLayoutConstraint constraintWithItem:blueV attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:redV attribute:NSLayoutAttributeWidth multiplier:0.5 constant:0.0];
        [self.view addConstraint:b_consWidth];
    
        /// 顶部距离 redV 20
        NSLayoutConstraint *b_consTop = [NSLayoutConstraint constraintWithItem:blueV attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:redV attribute:NSLayoutAttributeBottom multiplier:1.0 constant:20.0];
        [self.view addConstraint:b_consTop];

    最终效果:
    屏幕快照 2018-05-24 下午3.46.26

    2.3 添加约束的规则

    在创建约束之后,需要将其添加到作用的view上。
    在添加时要注意目标view需要遵循以下规则:

    (1)对于两个同层级view之间的约束关系,添加到它们的父view上
    (2)对于两个不同层级view之间的约束关系,添加到他们最近的共同父view上
    (3)对于有层次关系的两个view之间的约束关系,添加到层次较高的父view上

    3. VFL

    VFL全称是Visual Format Language,翻译过来是“可视化格式语言”,是苹果公司为了简化Autolayout的编码而推出的抽象语言。

        /*
         format :VFL语句
         opts :约束类型
         metrics :VFL语句中用到的具体数值
         views :VFL语句中用到的控件
         */
    + (NSArray<__kindof NSLayoutConstraint *> *)constraintsWithVisualFormat:(NSString *)format options:(NSLayoutFormatOptions)opts metrics:(NSDictionary<NSString *,id> *)metrics views:(NSDictionary<NSString *,id> *)views;

    @{@"redV" : redV} 等价于 NSDictionaryOfVariableBindings(redV)

    NSDictionary *views =
    
    NSDictionaryOfVariableBindings(blueView, redView);
    
    NSArray *conts2 =
    
    [NSLayoutConstraint constraintsWithVisualFormat:
    
    @"V:[blueView(==blueHeight)]-margin-|" options:0 metrics:
    
    @{@"blueHeight" : @40, @"margin" : @20} views:views];

    约束格式说明:

    水平方向        H:
    垂直方向        V:
    Views         [view]
    SuperView      |
    关系         >=,==,<=
    空间,间隙       -
    优先级        @value

    3.1 VFL 部分语法:

    H:|-100-[redV(200)]-|

    水平方向距离左边距100,宽度200

    V:|-200-[redV(64)]-|

    垂直方向距离顶部200,高度64

    H:[redV(72)]-12-[blueV(50)]

    水平方向redV 宽度72,blueV 宽度50,他们之间间距12

    H:[redV(>=60@700)]

    水平方向redV宽度大于等于60,优先级为700 (优先级最大1000)

    V:[redBox]-[yellowBox(==redBox)]

    竖直方向上,先有一个redBox,其下方紧接一个高度等于redBox高度的yellowBox

    H:|-10-[Find]-[FindNext]-[FindField(>=20)]-|

    水平方向上,Find距离父view左边缘默认间隔宽度,之后是FindNext距离Find间隔默认宽度;再之后是宽度不小于20的FindField,它和FindNext以及父view右边缘的间距都是默认宽度。(竖线“|” 表示superview的边缘)

    3.2 VFL的语法

    • 标准间隔:[button]-[textField]
    • 宽约束:[button(>=50)]
    • 与父视图的关系:|-50-[purpleBox]-50-|
    • 垂直布局:V:[topField]-10-[bottomField]
    • Flush Views:[maroonView][buleView]
    • 权重:[button(100@20)]
    • 等宽:[button(==button2)]
    • Multiple Predicates:[flexibleButton(>=70,<=100)]

    注意事项

    创建这种字符串时需要注意一下几点:
    * H:和V:每次都使用一个。
    * 视图变量名出现在方括号中,例如[view]。
    * 字符串中顺序是按照从顶到底,从左到右
    * 视图间隔以数字常量出现,例如-10-。
    * |表示父视图

    3.3 使用Auto Layout时需要注意的点

    • 注意禁用Autoresizing Masks。对于每个需要使用Auto Layout的视图需要调用setTranslatesAutoresizingMaskIntoConstraints:NO
    • VFL语句里不能包含空格和>,<这样的约束
    • 布局原理是由外向里布局,最先屏幕尺寸,再一层一层往里决定各个元素大小。
    • 删除视图时直接使用removeConstraint和removeConstraints时需要注意这样删除是没法删除视图不支持的约束导致view中还包含着那个约束(使用第三方库时需要特别注意下)。解决这个的办法就是添加约束时用一个局部变量保存下,删除时进行比较删掉和先前那个,还有个办法就是设置标记,constraint.identifier = @“What you want to call”。

    3.4 布局约束规则

    表达布局约束的规则可以使用一些简单的数学术语,如下表

    类型 描述
    属性 视图位置 NSLayoutAttributeLeft, NSLayoutAttributeRight, NSLayoutAttributeTop, NSLayoutAttributeBottom
    属性 视图前面后面 NSLayoutAttributeLeading, NSLayoutAttributeTrailing
    属性 视图的宽度和高度 NSLayoutAttributeWidth, NSLayoutAttributeHeight
    属性 视图中心 NSLayoutAttributeCenterX, NSLayoutAttributeCenterY
    属性 视图的基线,在视图底部上方放置文字的地方 NSLayoutAttributeBaseline
    属性 占位符,在与另一个约束的关系中没有用到某个属性时可以使用占位符 NSLayoutAttributeNotAnAttribute
    关系 允许将属性通过等式和不等式相互关联 NSLayoutRelationLessThanOrEqual, NSLayoutRelationEqual, NSLayoutRelationGreaterThanOrEqual
    数学运算 每个约束的乘数和相加性常数 CGFloat值

    3.5 View的改变会调用哪些方法

    • 改变frame.origin不会掉用layoutSubviews
    • 改变frame.size会使 superVIew的layoutSubviews调用和自己view的layoutSubviews方法
    • 改变bounds.origin和bounds.size都会调用superView和自己view的layoutSubviews方法

    3.6 VFL 实例:

    - (void)testVFL {
        UIView *redV = [[UIView alloc] init];
        redV.backgroundColor = [UIColor redColor];
        redV.translatesAutoresizingMaskIntoConstraints = NO;
        [self.view addSubview:redV];
    
        UIView *blueV = [[UIView alloc] init];
        blueV.backgroundColor = [UIColor blueColor];
        blueV.translatesAutoresizingMaskIntoConstraints = NO;
        [self.view addSubview:blueV];
        /*
         format :VFL语句
         opts :约束类型
         metrics :VFL语句中用到的具体数值
         views :VFL语句中用到的控件
         */
        //水平方向 redV 左右间距为20
        NSArray *cons1 = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-20-[redV]-20-|" options:0 metrics:nil views:@{@"redV":redV}];
        [self.view addConstraints:cons1];
    
        //垂直方法redV距离顶部 100, redV 高度为64, blueV顶部距离redV 100 像素, blueV的高度等于redV
        NSArray *cons2 = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-margin-[redV(64)]-margin-[blueV(==redV)]" options:NSLayoutFormatAlignAllRight metrics:@{@"margin" : @100} views:NSDictionaryOfVariableBindings(redV,blueV)];
        [self.view addConstraints:cons2];
    
        NSLayoutConstraint *cons = [NSLayoutConstraint constraintWithItem:blueV attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:redV attribute:NSLayoutAttributeWidth multiplier:0.5 constant:0.0];
        [self.view addConstraint:cons];
    }

    运行结果:
    2018-05-24_3.46.26

    文中演示Demo 均已开源在 GitHub上,这是链接: XWAutolayoutDemo In Github

    展开全文
  • Android AutoLayout全新的适配方式 堪称适配终结者

    万次阅读 多人点赞 2017-06-26 15:13:31
    转载请标明出处: ... 本文出自:【张鸿洋的博客】 一、概述相信Android的开发者对于设配问题都比较苦恼,Google官方虽然给出了一系列的建议,但是想要单纯使用这些建议将设备很轻松的做好,还是相当困难的。...
  • IOS AutoLayout 详解

    千次阅读 2018-07-26 18:06:23
    约束(autolayout)出现了,其实最开始的时候,ios dever们都还是坚持手写代码,毕竟自己用了好几年了,你说换就换,现在的需求你帮我写啊?所以导致当时使用约束的少之又少,直至后来出现了横屏和竖屏之类适配,而且...
  • 前段时间时间总是在纠结这个ios的Autolayout的布局问题。总感觉Apple这样做很麻烦,感觉Autolayout的代码写起来很别扭。半个眼都不想去看那些代码,又臭又长。其实不然,当现在Apple发布的各个产品上市之后,设备的...
  • 同时,下一代大屏iPhone已经发售了,Autolayout绝对是其中一个重要的界面兼容手段。为了能尽快做好适配好新设备的工作,我相信学习Autolayout这门技术也是必不可少。我作为一个使用了Autolayout大约一周左右的初学者...
  • 相信不少的人都知道有AutoLayout这么个玩意可以做屏幕适配,事实上,AutoLayout不仅仅只是一个为了多屏幕适配的工具,它真正的意义所在是给了程序员一种全新的布局思想。  本文主要依据真实项目实例从三个方向全...
  • 关于AutoLayout和代码修改约束

    千次阅读 2017-03-09 14:16:56
    autolayout
  • 关于AutoLayout 说实话 autolayout刚出现的时候,我感觉自动布局及其难用,在Xib中拉线拉着拉着就晕头转向的,并且用代码来添加一个约束就需要三行代码,而一个控件最少也需要3个约束来控制,看着约束的代码及其...
  • 万能适配器,AutoLayout使用! 前言:每当我们写好代码,调试布局会发现,每款手机显示的布局效果有时候不尽人意,这是因为我们在写代码时,只针对了调试机型屏幕做了设计,而没有考虑到每个手机适配的问题,虽然...
  • 最近在研究UITableViewCell高度的自适应,在网上找到了一个国内人员开发的工具类,自己下载下来研究了一下,感觉非常不错,用起来也非常方便,这是高手的博客地址...用这个之前要会使用AutoLayout
  • Autolayout

    2015-07-13 17:49:15
    这篇不是autolayout教程,只是autolayout动员文章和经验之谈,在本文第五节友情链接和推荐中,我将附上足够大家熟练使用autolayout的教程。这篇文章两个月前就想写下来,但因为一直工作较多,没有时间来完成。今天...
  • 如题,IOS开发的新手,关于autoLayout我自己看了资料做了下学习。现在做的一个东西,使用autoLayout但是却不按照我的意愿显示。 为了方便我就放图吧。 我希望中显示是这样子的。![图片说明]...
  • android适配autolayout的使用心得体会

    千次阅读 2018-06-29 11:11:31
    平时我们拿到设计图的时候是px,而我们android的尺寸单位,却是sp,dp之类的。传统的适配方案要建一大堆文件夹进行适配,百分比布局还要计算百分比。我们希望:拿到设计图,meta信息...用法1、将autolayout引入dependen
  • Autoresizing已经满足不了我们加约束的需求,而Autolayout功能强大,应用比较普遍,但有时候需要用代码来加约束,这时候用Autolayout就比较麻烦了,代码繁琐不说,代码量也是大大滴有!想对Autoresizing和Autolayout代码加...
  • 有趣的autolayout例子

    2017-05-19 10:37:00
    原文地址:有趣的autolayout例子 前言 好久没有写Blog了,这段时间有点忙。 本文举了3个比较有“特点”的Autolayout例子,源于微博上好友的提问,感觉比较有意思,也比较有代表性,就写了出来,分享给大家~ 至于...
  • 当我们对一个UIView使用了autolayout自动布局之后,也就意味着我们放弃了传统的通过设置view的frame等方式手动的修改、确定这个view的位置、尺寸属性。甚至从某种程度上讲,我们应该忘记view的frame属性:它的确定...
1 2 3 4 5 ... 20
收藏数 13,193
精华内容 5,277
关键字:

autolayout