【AutoLayout案例07-如何通过代码添加约束 Objective-C语言】

一、那么,接下来,我们就给大家介绍一下,如何通过代码,来实现这个AutoLayout

通知

1.咱们之前是不是都是通过,storyboard、来拖、拉、拽、的方式实现的吧

现在给大家介绍一下,如何通过代码,来实现

在继续介绍,如何通过代码,来实现AutoLayout之前呢,

我们先要给大家补充一个知识,就是我们添加约束的时候,是把这个约束添加给谁了

通知

这个知识,要给大家补充一下

好,来看

通知

那么,我先把这个,给大家关掉,来,看一下

我新建一个项目

通知

选择File-New-Project

通知

选择这个Single View Application

为一个控件,增加约束,这个约束,是增加给谁了,这个要注意

通知

Name:009添加约束规则

注意看,打开我们这个storyboard,我在这里拽一个什么啊,拽一个按钮吧

通知

拽一个按钮

通知

拽一个按钮,然后呢,设一下这个按钮的背景色

通知

设一个红色吧

通知

好,然后,接下来,我是不是要给这个按钮,增加约束,

这个按钮,现在是不是一个约束也没有

好,我现在给这个按钮增加一下约束,约束一下这个按钮的高和宽

通知

约束按钮的宽,是100

约束按钮的高,是100

通知

然后呢,点一下增加

增加两个约束,好,一增加

通知

然后呢,这个按钮,是不是先给它增加了一个高和宽了吧

先别给它去掉那个错误的警告

注意,刚才我仅仅是给按钮约束了一个高和宽

然后,我们看一下,左边,这个场景里面,Scene,里面

通知

右边这个控制器,叫一个故事板,左边这个叫一个场景

一个故事、一个场景

OK,这个场景,场景里面,看一下这个按钮,按钮里面,是不是有一个Constraints了

通知

约束吧,约束里面呢

通知

是不是有一个高、和宽、这一个约束

也就是说,当我们为一个控件,增加一个约束的时候,

如果说,这个约束,不依赖于其他控件的时候,

什么叫不依赖于其他控件的时候,

你设置这个控件的宽、和高,就是写了吧,高就是写了100,

这个时候,不依赖于其他控件吧

比如说,你设置这个控件的高,等于别的控件的高

这个时候,你设置这个控件的高,是不是依赖于别的控件了

或者说,你设置这个控件,距离父控件左边距离,这个时候,这个约束,是不是也依赖于父控件了,要用到父控件啊

就是说,当你为控件设置一个约束,不依赖于别的控件的时候,这个时候,这个约束是,增加到这个控件自己上

通知

是不是增加到这个控件自己上的约束啊

那么,这是第一个

1)当设置一个约束,不依赖于任何其他控件的时候,这个约束,会增加到当前控件的自己身上

OK,这是我们第一个要说的

通知

看看

通知

OK,就是这点,

通知

如果添加的约束和其他控件没有关系,就会添加到自己身上

意思就是说,你这个控件,增加这个约束,不依赖于任何别的控件,

自己就可以写完,比如100,100,高、和宽,都是100

不依赖于别的控件,那么它这个约束,就会增加到控件自己身上

这是第一个

通知

就相当于我们刚才这样,增加高和宽,都是写的100,不依赖于别的控件,那么这个约束,就会增加到这个控件自己的身上

通知

好,再看一下

2)比如说,让这个按钮,注意看,让这个按钮,让它,水平居中对齐、垂直居中对齐

通知

点击增加

注意,这个Constraints

通知

水平居中对齐、垂直居中对齐

通知

通知

注意,这个水平居中对齐、垂直居中对齐

这个约束,是增加到哪儿了

增加到这个按钮的父控件上了吧

通知

是不是,也就是说,当这个约束,是相对于

通知

当设置子控件的一个约束,这个约束,要用到父控件的某个值

这个时候,这个约束,就会增加到,父控件上

通知

OK,把这个警告解决一下

通知

解决,Fix Misplacement

通知

OK

通知

好,这是我们的第二个情况

通知
通知

OK,看一下,

2)如果是父子关系,设置子控件的约束,约束会添加到父控件上

通知

并不会增加到这个子控件上

只有一种情况,会增加到子控件上,就是设置这个控件的约束的时候,它不依赖于任何的控件,自己就能设置,只有这种情况,这个约束,会增加到控件自己身上

那么,比如说,其他情况,

1)第一种情况,设置这个控件的约束,和父控件有关,是父子关系的时候,这个约束,会添加到父控件身上

2)第二种情况,如果是父子关系,设置子控件的约束,约束会添加到父控件上

通知

3)OK,那么,接下来,我们再看第三个

我这里,再来一个按钮

通知

再来一个按钮,

这个按钮

通知

这个按钮叫做Button01

通知
通知

我设置这个按钮(Button01)和这个红色的按钮,让它俩的高和宽相等,让它俩的宽和高,等宽、等高

通知

点击增加

设完以后,注意看,这儿会加东西吗

通知

走一个

通知

增加了没,加了吧

也就是说,当你设置两个兄弟之间,有相互依赖关系的时候,这个依赖关系,也会添加到这两个兄弟的父控件上

这是我们的哪幅图啊,

通知

就是我们的这幅图

通知

当设置两个兄弟之间的依赖的时候,这个兄弟之间的依赖约束,也会添加到父控件上

通知

同一个层级间的约束关系,都会添加到父控件上

通知
通知

更严谨一点儿,应该这么说,

通知

注意看

通知

因为当前我们这个Button

通知

Button和Button01,它俩的父控件,是不是都是这个View啊

它俩的父控件,都是这个View

所以,当你设置它俩相关的关系的时候,它俩之间的关系,这个约束,会添加到它俩共同的父控件下面吧

4)当设置两个

通知

当设置两个控件,它俩相关,设置这个控件,跟这个控件

相关,它俩相关联,那么,这个时候,这个约束,会加到哪儿呢

会加到它俩的共同的父控件上

它的父控件,是这个

通知

它的父控件,是这个

通知

只有这个,是不是才是它俩共同的父控件啊

通知

所以说,当设置两个控件,兄弟控件,它俩的关系的时候,那么,这个时候,它会找到这两个控件共同的父控件,会把约束添加到,它俩的共同的父控件上,

明白了吗,这就是为什么,刚才

通知

设了一堆约束以后,有的约束,在这个按钮下面

通知

有的约束,在这个父控件的下面

通知

咱们刚才写了一堆约束,大部分约束,是不是,都是我们兄弟关系之间的约束

和父子之间的约束

所以说,大部分,是不是都加到这个父控件,控制器View下面,都加到这个地方了

通知

这是这里要给大家补充的,创建约束的时候,这个约束到底是创建到谁上面了,

1)如果说,这个约束,是自己、不依赖于任何一个别人,就是创建到自己身上,

2)如果说,它是兄弟的关系

通知

就创建到它共同的父元素上

3)如果是堂兄弟的关系,

通知

就创建到共同的父控件上

通知

如果是父子关系的话,肯定就直接加到父控件上了

OK,那么,我们为什么要说这个东西呢

我们写代码,通过代码,来创建约束的时候,你创建完的约束,这个约束,是要加到哪个子控件上啊

这个时候,你是不是得知道这个规则啊

1)如果说,这个约束,没有依赖于任何的控件

那么,这个约束,就加到当前控件自己的身上

2)如果说,这个约束,是父子关系,那么,这个约束,就要加到父控件上

3)如果说,这个约束,是兄弟关系,那么,这个时候,这个约束,就要加到这两个兄弟最近的共同的父元素上

这就是我们这个添加约束的规则

OK,了解了这个规则以后

通知

接下来,我们就看一下

通知

如何通过代码,来创建这个约束

通过代码,创建约束,非常简单,一个约束,就是一个对象

通知

这个对象,就叫NSLayoutConstraint

一个约束,就是一个对象

一个对象,就是我们这么一个约束对象

好,然后,接下来,你要创建一个约束,是不是要创建一个这个类型的对象啊

通知

要创建一个约束,就要创建一个这么一个类型的对象

就好比说,你要创建一个“人”对象,是不是要创建一个“Person”对象啊

这里就是,你要创建一个约束,就得创建一个NSLayoutConstraint类型的对象,

就要创建一个它的这么一个对象

然后,怎么把这个约束,加到某个控件上呢

拿到对应的控件,比如说,拿到self.view

调用这个控件的addConstraint

直接传一个约束进来

通知

或者是传一组约束进来

通知

都可以

有几个注意点,当我们在用代码创建约束的时候,第一步:

1)一定要禁止这个autoresizing功能

比如说,你要为这个view添加约束

通知

那么,一定要禁用这个view“点”translatesAutoresizingMaskIntoConstraints = NO;

把它设置为NO

必须设置这个,否则会有问题

否则运行就报异常

这是第一点,需要注意的

2)你在设置约束之前,必须保证,这些控件的父子关系,都已经设置好了

通知

就是说,你已经创建好这些控件,并且把这个控件,谁是谁的子控件,谁是谁的父控件,这些都已经设置好了,

通过addSubview

这些都已经设置好了

设置好这些以后,然后,才能增加约束

否则,不能增加约束

否则,是有问题的

这是第二个需要注意的地方

通知

3)第三步:就是,你已经通过AutoLayout来写了,还有必要再去手动去设置frame吗

不需要了吧

就不要再手动设置frame了

所以说,这三点,一定要注意

通知

有了这三点,接下来,我们就可以写代码了

通知

好,等会儿,咱们再解释这个东西

来,咱们先看一下这个案例

通知

二、接下来,我们就用代码的方式,实现一下,我们这里的案例

1.案例3

通知

案例3,是哪个案例呢

通知

这是案例2,案例3,

通知

这是案例3,咱们来做案例4

通知
通知

把这个最上面的“案例3”,改成“案例4”

通知

来,这个案例

通知

我们用代码来实现一下

那么,这个基本的步骤,就是先

1)创建一个蓝色View

2)加到控制器里面

3)再创建一个红色View

4)也加到控制器的View里面

5)把这两个View创建好以后,然后,先把这个前提搞定,哪个前提啊

通知

5)禁用autoresizing

6)然后呢,把这个都加进去

通知

然后,接下来,就可以写代码了

OK,首先,我们要通过代码的方式,把这个效果实现一下

通知

来,开搞

三、把这个效果实现一下

通知

这个的意思就是,给大家解释一下我们这里,创建控件的时候,控件的这个约束,是加到哪个控件下面

顺便再把这个再给大家看一下

通知

每一个约束,是不是都是等于:

谁 等于 谁 的 什么

就是

谁的什么 等于 谁的什么 + 加上 多少 * 乘以 多少

是不是始终是这样的一个公式

Superview.Center X Equal (Button.Center X + Constant) * Multiplier

始终是这样的公式

把这个公式,我们记住

2.OK,接下来,通过代码,来创建约束

选择File-New-Project

通知

新建

通知

Name:010通过代码创建约束

通知

我们这里就是我们的控制器啊

好,接下来,我们在这个控制器的viewDidLoad里面,我们就把那几个约束写一下

通知

1)创建蓝色View

2)创建红色View

3)禁用autoresizing

4)创建并添加约束

是不是基本就这么四部

通知

1)OK,来,我们创建蓝色View,怎么创建

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

我们看着这个效果来创建

通知

首先是,设置背景色,是蓝色吧

背景色,蓝色

//设置背景色

blueView.backgroundColor = [UIColor blueColor];

好,为了看的清楚一点儿,先设置一下frame

//设置frame

我们这个设置frame,目的是为了我们能暂时能看到它

等会儿我们就把它删了

blueView.frame = CGRectMake(0,0,100,100);

通知

是不是要把蓝色View,加到控制器里面

//把蓝色View加到self.view中

[self.view addSubview:blueView];

通知

然后呢,接下来呢

是不是创建红色View

//创建红色View

UIView redView = [[UIView alloc] init];

//设置背景色

redView.backgroundColor = [UIColor redColor];

然后呢,设置它的frame,先让我们能看到

//设置frame

redView.frame = CGRectMake(100,100,100,100);

OK,然后,是不是把红色View,也加进去啊

通知

OK,这两个View,是不是就创建好了

command + R

通知

好,是不是这两个有了吧

有了以后,说明创建没有问题

这两个frame,就注释掉了

通知

不要它俩了,因为我们是要通过AutoLayout来设置,不要这两个frame了

通知

好,首先,是不是要禁用那个autoresizing

让我们这个蓝色View“点”translatesAutoresizingMaskIntoConstraints = NO;

通知

这个等于NO,禁用autoresizing

通知

然后,让我们的红色View“点”translatesAutoresizingMaskIntoConstraints = NO;

让它俩,都等于NO

通知

这两个控件,是不是都禁用autoresizing了

好,然后,就开始,创建约束了

来,我们注意看,第一个,我们先创建蓝色View的约束

//1.创建蓝色View的约束

//2.创建红色View的约束

通知

OK,蓝色View的约束,我们该怎么创建

通知

1)第一个约束,蓝色View的高度,是50

2)第二个约束,蓝色View,距离、左、上、右、都是30

这样的话,就确定了蓝色View的高度,以及X、Y、宽、是不是都确定了

OK,所以,我们只要创建这么几个约束,就可以了

//创建并添加约束

//1. 创建蓝色View的约束

//1.1 创建蓝色View高度的约束

//1.2 距离左边30

//1.3 距离上边30

//1.4 距离右边30

通知

OK,把这四个设置好,它就设置好了

1)OK,首先,它就是,蓝色View的高度,怎么约束呢

我们说,每一个约束,

通知

每一个约束,就是一个NSLayoutConstraint对象

通知

NSLayoutConstraint对象吧

所以说,我们咋写啊

NSLayoutConstraint

通知

NSLayoutConstraint *blueHC = [NSLayoutConstraint ]

注意,怎么创建这个对象呢

通知

constraint

通知

constraintsWith,我们用下面这个吧

通知

constraintsWith:1、2、3、4、5、6、7

这么多参数

回车

七个参数

通知

看到这么多参数,感觉爽不爽

好,爽,证明大家已经头晕了

来,看一下,数数几个参数,一、二、三、四、五、六、七、是不是七个参数

感觉是不是,很疼吧

但是没关系

这个,七个参数,其实很简单

只要你看到咱们刚才上午刚才给大家介绍那个公式,

来,我们选中任何一个约束

通知

这儿,没有约束,怎么办

打开刚才写的一个代码

通知

打开看看任何一个写的代码

通知

来,选中任何一个约束

通知

这个约束是不是:

谁的什么 等于 谁的什么 加多少 乘多少

Superview.Center X Equal Button.Center X + Constant * Multiplier

是不是

来,再看一下咱们的参数

通知

1)第一个参数constraintWithItem:(id),就是谁的什么,额,谁的

2)第二个参数attribute:(NSLayoutAttribute),就是谁的什么,额,什么

3)第三个参数relatedBy:(NSLayoutRelation),就是等于,就是那个关系

4)第四个参数toItem:(id),就是谁的什么,额,谁的,另外一个的

5)第五个参数attribute:(NSLayoutAttribute),就是谁的什么,额,什么

6)第六个参数multiplier:(CGFloat),就是乘以多少

7)第七个参数constant:(CGFloat),就是加上多少

通知

是不是就是那个公式里面的东西啊

来,把这个参数,给它写一下

// 谁的什么,

// A对象 的 某属性 等于 B对象 的 某属性 乘以 multiplier 加 constant

我们参数里面,是先乘后加吧,我们参数里面,是先写乘后写加参数

constant,是不是这是个常量吧

通知

Constant,这是不是加,Constant,是不是相加的

Multiplier,这是不是乘,Multiplier,是不是相乘的

Constant,这个值,是用来相加的

Multiplier,这个值,是用来相乘的

其实我们这里再给大家写一下,就是什么意思,就是我们那个

通知

就是我们这里的

通知

参数1,参数1

//参数1 的 某属性

//参数1 的 参数2

每一个参数,是不是表示这个意思啊

等于,是不是就是参数3,

//参数 的 参数2 参数3 参数4

通知
通知

//A对象 的 某属性 等于 B对象 的 某属性 乘以 multiplier 加 constant

//参数 的 参数2 参数3 参数4 参数5 乘以 参数6 加 参数7

是不是基本就这个意思

我们第一个要求是,约束蓝色view的高度吧

蓝色View,我们这里,如果要约束的话,约束谁,

蓝色View,蓝色View的什么,高度,等于什么值吧

是不是这么来约束

蓝色View的,蓝色View是谁,blueView,吧

通知

蓝色View的什么,是不是这儿是一个这么个东西

通知

点住command + 看一下

是不是就是枚举

enum NSLayoutAttribute

是枚举吧

枚举,点一下,进来

通知

是不是,有这么多个枚举值

通知

1)NSLayoutAttributeLeft = 1,距离左边的距离

2)NSLayoutAttributeRight,距离右边的距离

3)NSLayoutAttributeTop,距离上边的距离

4)NSLayoutAttributeBottom,距离底边的距离

5)NSLayoutAttributeLeading,距离头部的距离

6)NSLayoutAttributeTrailing,距离尾部的距离

7)NSLayoutAttributeWidth,宽度

8)NSLayoutAttributeHeight,高度

9)NSLayoutAttributeCenterX,X的距离

10)NSLayoutAttributeCenterY,Y的距离

是不是有这么多个值

通知

这么多个值,每个值什么意思,

通知
通知
通知
通知

对,每一个是啥意思,我这儿都给你列出来了

通知

我们这里用的是哪个

是不是高度啊

通知

是不是要设置这个View的高度

用到是这个高度

来,注意看啊

通知
通知

我们约束当前,蓝色View的高度

通知

高度,NSLayoutAttributeHeight,

通知

蓝色View的高度,是不是要等于一个值

等于是什么,

NSLayoutRelation,

通知

关系,Relation,

通知

Relation,关系,Equal,是不是等于

1)NSLayoutRelationEqual:是等于,

2)NSLayoutRelationGreaterThanOrEqual:大于或等于

3)NSLayoutRelationLessThanOrEqual:小于或等于

通知

我们这里要的是什么,等于,

通知

然后呢,就是,蓝色View的高度,等于谁,

我们这里蓝色View的高度,是要相对别的View来设置吗,不是吧,

根本不是,

通知
通知

我们蓝色View的高度,是不是就是等于50,

就是等于50,所以说,我们这里是,

通知

蓝色View的高度,等于,有别的控件吗,没有,那么你说写啥,nil

通知

既然没有别的控件,那么这里也不需要写别的控件的属性了吧,

通知

这里是不是没有属性啊

没有属性,这里是一个枚举,不能传一个nil,枚举要传一个Not,NSLayoutAttributeNotAnAttribute

通知

NotAnAttribute:不是一个属性

传一个这个,

就是说,你不相对于别的控件的话, 这个参数,toItem:就传一个nil,

attribute:这个属性,就写一个NotAnAttribute,

然后,乘以几啊,乘以1

通知

然后,乘以几呢,乘以1,是不是1.0,写个1,也行,

通知

加多少,加个50,

通知

是不是加个50,

你都写0,那这个高度,是不是就是0啦,

这个高度,等于50,乘以1,

是不是这个意思,

所以说,最终这个约束,就是50,啊

通知

蓝色View的高度 = 50 * 1.0

这两个是不是都没有用啊,没用啊

通知

这个约束,用到了别的控件了吗,没有,

那你说,这个约束,应该加给谁啊

//把约束添加到控件上

因为你没有用到别的约束,是不是要把这个控件添加给自己

blueView addConstraint

通知
通知

[blueView addConstraint : ] ;

然后,把谁加进来

通知

就是我们这里的blue高度,HC

[blueView addConstraint:blueHC];

通知

OK,这样的话,这个高度约束,是不是已经加进来了

高度加进来了,然后,接下来,该干什么了,

2)是不是距离左边距离,

这些,是不是怎么样,

通知

command + C、command + V

通知

报错了吧

通知

下边这个距离上边30、距离右边30、也分别复制一份

通知

注意,距离左边,是什么,蓝色View的什么,

通知

蓝色View的,是不是左边,

蓝色View的左边,等于谁,

通知

蓝色View的左边,等于父控件的左边,加上20,

父控件的左边,是不是0,加上20,

self.view,是不是父控件,

或者说是,blueView.superview

是不是一样

等于父控件的什么,父控件的左边,

通知

NSLayoutAttributeLeft,

加上多少,20

乘以多少,1.0,吧

通知

2)这叫什么,blueView的什么,Left吧,blueView的Left

//1.2 距离左边30

这里的变量名,改成blueLeft =

通知

NSLayoutConstraint *blueLeft = [NSLayoutConstraint constraintWithItem:blueView attribute:NSLayoutAttributeLeft relateBy:NSLayoutRelationEqual toItem:blueView.superview attribute:NSLayoutAttributeLeft multiplier:1.0 constant:20];

这样的话,距离左边30,是不是搞定了,额,30吧,不是20,这里改一下啊

通知

把这里改成30,

通知

3)距离上边30

这个变量名,应该是什么,它的什么啊,上边吧,Top

blueTop

通知

蓝色View的什么,

通知

上边,

通知

蓝色View的上边,等于,谁,

是不是等于我们蓝色View的superview啊

通知

蓝色View的父控件的什么,是不是也是上边,

通知

蓝色View的上边,等于父控件的上边,加上多少,

30

还乘以几,

1.0吧

通知

然后,是不是该距离右边了

通知

4)距离右边30

蓝色View的什么,Right,

blueRight

通知

蓝色View的什么,这个才是Right呢吧

通知

这个才是右边了吧

通知

蓝色View的Right,等于谁,是不是也是等于父控件,

通知

父控件的右边,减30啊

加30,还是减30,

为啥是减30,

假如说,屏幕整个的高度是320,

蓝色控件的Y,右边,就是320,

通知

再减30,是不是290

通知

所以说,是不是减30,

蓝色View的

通知

蓝色View的右边,等于,父元素,

通知

父元素的什么,

是不是也是右边,

通知

父元素的右边,是不是屏幕的宽度320,假如说,是不是再减30,

是不是就是290

所以说,再减30,是不是就是我们这里要的宽度,

通知

额,对,减30,这里把-50,改成-30

通知

这几个都没有问题了之后呢,我们说,第一个约束,加到控件里面了,

通知

后面这几个约束,是不是也得加到控件里面啊

通知

后面,这几个约束,你得加到哪个控件里面,

通知

对,这个蓝色View,是不是相对于父控件的一些约束啊

所以说,这些约束,就得加到哪里,父控件里,

加到父控件里,怎么加

通知

[self.view addConstraint: ]

通知

[self.view addConstraint:blueLeft];

通知

选中这句话,[self.view addConstraint:blueLeft];

command + C、command + V

通知

选中这个blueTop,command + C、command + V

通知

[self.view addConstraint:blueTop];

再选中这句话,command + C、command + V

通知

再选中这个blueRight,复制到下面来,

通知

blueRight

通知

是不是搞定了

是不是这几个都加好了,红色View,我创建了吗,

通知

红色View,没有创建,但是这个时候,可以看到蓝色View了吧,

command + R

通知
通知

蓝色View,看到了吗,

30,30,30,50,没有问题吧

这个搞定了

OK,接下来,再通过代码,创建红色的View

3.创建红色View

爽吗,这个代码

通知

好吧,这个代码,是不是写起来,很不爽,

但是,这些代码,就是没有任何技术含量,就是苦力啊

现在我们就好比是民工,在干什么,搬砖

//2.创建红色View的约束

//2.1

注意看,首先,红色View,哪些约束

通知

1)第一:约束红色View,距离上边,是不是30间距

2)第二:约束红色View,是不是和蓝色View,右边对齐,

3)第三:约束红色View,等于蓝色View的宽度

4)第四:约束红色View,等于蓝色View的宽度的一半儿

5)第五:约束红色View,高度等于蓝色View的高度

//2.1 让红色View的height等于蓝色View的高度

哎,直接等于,当然不行吧

你等于多少啊,等于上面这个高度,万一哪一天,我上面这个高度变了呢

通知

你等于不能写死,要等于上面这个height啊

相对关系,一变就都变了

//2.2 让红色View的top,距离蓝色View,30

//2.3 让红色View ,和蓝色View ,右对齐

//2.4 让红色View,的宽度,等于蓝色View的宽度的0.5倍

通知

1)设置完红色View的高度以后,红色View的高度,就确定了,

2)设置完红色View的宽度,等于蓝色View的宽度的一半儿以后,红色View的宽度,是不是也确定了,

3)设置好它距离上边30,以后,红色View的高度是不是确定了,

4)设置完右对齐以后,右对齐确定了,宽度确定了,X是不是确定了,

所以说,把这些搞定,是不是就OK了,

来,来,来,搞一下,

NSLayoutConstraint *redHC

这个叫啥,红色View的高度约束吧

咋写

NSLayoutConstraint *redHC = [NSLayoutConstraint constraintWithItem:

哎,其实不需要写吧,command + C

通知

command + V

通知

注意,红色View的高度,就是什么啊

红色View的什么,

通知

红色View的

通知

红色View的什么,

通知

高度,height

通知

高度,height吧

我现在是不是要让红色View的高度,等于蓝色View的高度,所以我就让红色View的高度,等于谁,蓝色View的

通知

蓝色View的,什么,height,吧

通知

高度,乘以1.0,加0

通知
通知

这样,红色View的高度,就刚好和蓝色View一样了,

前面咱们已经创建红色View了吧

通知

红色View吧,创建好了吧,

一开始,是创建蓝色View,和红色View吧

通知

1)创建蓝色View

2)创建红色View

通知

3)禁用autoresizing

通知

4)创建蓝色View的约束,并加进去

通知

5)接下来,是不是该创建红色View的约束了

通知

OK,现在红色View的高度,是不是等于蓝色View的高度了,

对,加进去,往哪儿加,

通知

对,这个约束,是不是红色View,依赖于蓝色View了,

所以说,这个时候,是不是得把它加到我们的父控件里面,

通知

self.view 什么

[self.view addConstraint: ]

通知

等于什么,redHC吧

[self.view addConstraint:redHC];

通知

是不是这个加好了,

2)然后,紧接着,再让红色View的距离top,等于蓝色View的底边 加 30 啊

距蓝色View是不是30 啊

来,咱们直接写,就OK了

通知

command + C、command + V

来、来、来、来、来、command + V

通知

红色View的什么,是不是Top啊

通知

红色View的Top,红色View的什么

通知

Top

通知

Top,等于,啥,是不是蓝色View的,蓝色View的什么,是不是底边啊

通知

蓝色View的底边吧,

通知

蓝色View的Bottom,加多少,加30,是不是乘以1,

通知

是不是搞定了

这个约束,也是红色View,与蓝色View,相关,

它俩是兄弟关系,所以说,约束是不是也得加到父容器里面,

通知

搞定了吧

好,现在我们这个约束,是不是也加进来了,

接下来,command + C、command + V

3)红色View与蓝色View右对齐

通知
通知

这个是什么,redRight,吧,

是不是红色View,右对齐啊

怎么写,红色View的哪一边,

通知

红色View的哪一边,红色View的右边吧,

NSLayoutAttributeRight

通知

等于,谁,

蓝色View,的,哪边,右边,

NSLayoutAttributeRight,

通知

乘以1,是不是加0,

通知

好,然后,这里是什么,

[self.view addConstraint: ];

通知

Right,吧,

[self.view addConstraint:redRight];

通知

是不是加进来了,

4)然后,接下来,是不是红色View的宽度,是不是等于蓝色View的宽度乘以0.5啊

command + C、command + V

通知

command + V、

通知

red什么,redWidth,吧,

通知

首先,把这个约束,复制到下面来,

command + C 、 command + V、

通知

首先,把这个约束,是不是加进来,

通知

注意看啊,红色View的什么,

通知

width,吧

通知

宽度,等于,什么,蓝色View的什么,宽度,

通知

宽度,width,

通知

加多少,0,吧,

通知

乘以多少,0.5,吧,

通知

乘以,0.5

通知

然后呢,加进来,

红色View,是不是搞定了,

试试看,command + R

通知

搞定了没,

4.有一个问题啊,我们现在,这个蓝色View距离左、右、上、的30,是距离View的30,还是距离什么的30,还是距离状态栏的30,

现在是不是这个蓝色View,距离View是不是30,啊

你要想让它距离状态栏,30 , 怎么写,

蓝色View,距离上边吧,那个代码在哪儿呢,

通知

蓝色View,的上边,等于,我们superview,的上边,加30,吧,

通知

你把这个,别让它等于superview,等于我们这个,self.topLayoutGuide

通知
通知

看到这个了吗,topLayoutGuide,

通知

topLayoutGuide,

相对于它,进行,偏移,30,是不是就OK了,

对,这就是我们上面那个topLayoutGuide,

来,command + R

通知

哎,没有变化吗,

来,给它加上个10,试试看,

通知

command + R

通知

是没有变化吧,

那这个地方,我看,这个地方,

通知

self.view.,view的什么,

通知

我们以前是self.view的什么,以前是不是self.view的Top,view的顶边啊

通知

view的顶部吧,view的顶部,

看一下,这儿能不能改啊,

以前,如果是view的顶部,

通知

注意,如果我们这里,相对是view的顶部,相对于view的顶部,加10,是这个效果啊,

我们要相对于状态栏,的顶部,

哦,对,相对于状态栏的底部吧,

状态栏,self.topLayoutGuide

通知

状态栏,应该是,底部吧,

通知

底部,bottom

通知

状态栏,的底部,加10,

通知

加10,是不是看到的效果不是很明显,

通知

改成加30,

通知

是不是加30,效果就明显了

好,把这个改回来,self.view,的Top,

通知

self.view 的,Top,

通知

OK,这样的话,我们就把这个,通过代码实现,就搞定了吧,

通知

通过代码实现呢,这个大家,就了解一下,就可以了,

通知

这个呢,下来写一两遍,就可以了,

通知

好,这个就是这样

通知
通知

好,这个代码,大家作为一个了解,

就OK了,

以后,估计也用的少,

除非你就是在项目里,确实用到了这些,

注意,我们这个约束,写的时候,你始终把,这个公式,记住

通知

写的时候,始终把这个公式记住:

obj1.property1 = (obj2.property2 * multiplier ) + constant value

某个对象的某个属性,等于,另外一个对象的某个属性,乘以多少,加上多少

把这个公式记住,

写代码时候,就不会写错,

这是我们这儿的一个东西

通知
通知

好,大家休息一下吧

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清风清晨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值