[New learn]AutoLayout调查基于code

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[New learn]AutoLayout调查基于code相关的知识,希望对你有一定的参考价值。

代码https://github.com/xufeng79x/TestAutolayout-code2

1.简介

  前一篇文章[New learn]AutoLayout调查基于IB讲述了如何在IB的基础上为控件添加约束。本文主要讲述如何在代码情况下操作autolayout

 

2.约束总结:

  在上一篇文章中的主要约束为:

  技术分享

 

总结为:

  1.两个view各自和边缘间隔20

  2.两个view与top边缘相隔30

  3.两个之间相隔80

  4.两个view的高宽比保持不变1:1

  5.两个view的宽度保持相等

 

3.使用VFL语言

  VFL为Visual format language的缩写,意为可视化格式语言。他不是一种计算机语言,应该算是一种数据描述格式。

  过多的对于VFL不做解释,这里仅仅举几个??:

@"H:|-20-[redView]-80-[blueView]-20-|"

 

  上述字符串既是一个VFL的表达格式,表达了下述两个横向上的约束:

  1.两个view各自和边缘间隔20 

  3.两个之间相隔80  

  

4.代码表达约束

  分为两步,创建约束和设置约束

  1.创建约束  

    // 使用VFL描述进行约束设定
    
    // 1.创建名称映射,以便于VFL中的[view名称]能够和正真的view实例像映射
    NSDictionary *nameMap = @{@"redView":redView,@"blueView":blueView};
    
    // 2.1使用VFL描述创建约束-水平约束
    NSArray *horizontalConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-20-[redView]-80-[blueView]-20-|" options:0 metrics:nil views:nameMap];
    
    // 2.2使用VFL描述创建约束-垂直约束
    NSArray *verticalRedViewConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-30-[redView]" options:0 metrics:nil views:nameMap];
    
    NSArray *verticalBlueViewConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-30-[blueView]" options:0 metrics:nil views:nameMap];

 

上述约束其实已经将横向和纵向的约束表达清楚,既已经将下面的几个约束表达清楚了:

  1.两个view各自和边缘间隔20

  2.两个view与top边缘相隔30

  3.两个之间相隔80

 

但是通过使用VFL语言有一个弊端就是无法实现对于view之间或者本身需要经过计算才能获得的约束,比如余下两个约束就无法通过VFL语言进行定义:

  4.两个view的高宽比保持不变1:1

  5.两个view的宽度保持相等

除了constraintsWithVisualFormat方法,NSLayoutConstraint还给出了另外一个方法来解决这件问题:

    //3. 将两个view增加等宽约束
    NSLayoutConstraint *widthConstraint = [NSLayoutConstraint
                  constraintWithItem:redView
                  attribute:NSLayoutAttributeWidth
                  relatedBy:NSLayoutRelationEqual
                  toItem: blueView
                  attribute:NSLayoutAttributeWidth
                  multiplier:1.0f
                  constant:0];
    
    
    
    
    // 4.将两个view增加长宽等比例约束
    NSLayoutConstraint *redRatioConstraint =[NSLayoutConstraint
                                     constraintWithItem:redView
                                     attribute:NSLayoutAttributeWidth
                                     relatedBy:NSLayoutRelationEqual
                                     toItem:redView
                                     attribute:NSLayoutAttributeHeight
                                     multiplier:1.0/1.0 //Aspect ratio: 1*height = 1*width
                                     constant:0.0f];
    
    
    NSLayoutConstraint *blueRatioConstraint =[NSLayoutConstraint
                                             constraintWithItem:blueView
                                             attribute:NSLayoutAttributeWidth
                                             relatedBy:NSLayoutRelationEqual
                                             toItem:blueView
                                             attribute:NSLayoutAttributeHeight
                                             multiplier:1.0/1.0 //Aspect ratio: 1*height = 1*width
                                             constant:0.0f];

 

此方法的参数可以形象的表达如下:

  技术分享

 

  2.设置约束 

    // 5.设置约束
    [self.view addConstraints:horizontalConstraints];
    [self.view addConstraints:verticalRedViewConstraints];
    [self.view addConstraints:verticalBlueViewConstraints];
    [self.view addConstraint:widthConstraint];
    [redView addConstraint:redRatioConstraint];
    [blueView addConstraint:blueRatioConstraint];

 

  如上我们将对应的约束设定到了对应的view上,但是这里有一个问题,上述约束设定的view并不相同,那么我们怎么知道当前约束设定到哪个view呢?

  一般规则为:1.当约束只约束自身的则将约束设定到自身,如4和5这两个约束。

        2.当约束涉及到多个view之间的关系,则将此约束设定到他们的共同父view(有可能是共同祖先)上。如3约束。

        3.当约束涉及到自身和其view时候,则将约束设定到父view上,如1,2约束

 

关于这一点我们也可以在基于IB时候的操作页面上一窥究竟:

   技术分享

 

 

 

以上。

 

以上是关于[New learn]AutoLayout调查基于code的主要内容,如果未能解决你的问题,请参考以下文章

[New learn] NSOperation基本使用

Generalizing from a Few Examples: A Survey on Few-Shot Learning(从几个例子总结:关于少镜头学习的调查)

无法使用 Autolayout 正确构建 UIScrollView

论文阅读—A New Constructive Heuristic Driven by Machine Learning for the T raveling Salesman Problem

基于Autolayout的动画

[New learn]SDWebImage