iOS学习——AutoLayout中利用 NSLayoutConstraint设置相对布局

没有太多要说的,只是最近项目要结了,所以有些时间来做做笔记。

AutoLayout给我的感觉就是充分利用了布局的相对性:对于一个新控件(item1),我们要在界面中确定它的位置,但是需要保证他和其他控件(item2)保持一定的关系,比如item1一定要在item2上边20个像素点的位置,或者item1的宽度是item2的一半。通过[item1 setFrame:CGRectMake(x,y,width,height)]; 可以确定item1的相对于屏幕原点的位置,也可以手动调整大小使其尺寸满足条件,但是如果item2的位置或者尺寸变化的时候,所有和item2存在相对位置关系的空间都要重新setFrame,这是显然不可取的。

在storyboard中可以通过各种drag操作设置各种Constraints,相对布局也就设置好了,但是如果不用故事版,用代码怎样实现这样的功能——NSLayoutContraint。

使用过程如下:


  1. 对要使用相对布局的空间设置setTranslatesAutoresizingMaskIntoConstraintsNO
  2. 声明NSLayoutContraint的对
  3. 对这个对象添加布局设置;
  4. 将这个对象添加到所有关联控件的公共父view中。
举个例子喽:
0在进行上述过程之前,要确保已经将item添加到superview中了
[super.view addSubview :item1];
不然会crash,亲测!

1前提设置

[item1 setTranslatesAutoresizingMaskIntoConstraints:NO];


2声明NSLayoutContraint的对象,
3对这个对象添加布局设置:

NSLayoutConstraint *atrributeBottom = [NSLayoutConstraint constraintWithItem:item1 

attribute:NSLayoutAttributeBottom  

relatedBy:NSLayoutRelationEqual 

toItem:item2 

attribute:NSLayoutAttributeTop 

       multiplier:1.0constant:-20];


4如果这个item1和item2是self.view的subview,则将这个对象添加到所有关联控件的公共父view中

[self.viewaddConstraint : atrributeBottom ];


这样就满足了上文中提到的“item1一定要在item2上边20个像素点的位置”。解释一下,上图:

(我去为什么pad微信和mac微信不能同时登陆,用pad画个图还得通过手机传到电脑上,这图画的一种岁月静好的感觉)



item1就是待安放的控件,item2就是参考系,

NSLayoutConstraint *atrributeBottom = [NSLayoutConstraint constraintWithItem:item1 

attribute:NSLayoutAttributeBottom       relatedBy:NSLayoutRelationEqual 

toItem:item2 

attribute:NSLayoutAttributeTop 

       multiplier:1.0 constant:-20];

     这条添加属性的语句第一行的作用就是指出控件以及该控件本次需要设定的属性,即 item1.NSLayoutAttributeBottom ,第二行相关语句和作用相同,即item2.NSLayoutAttributeTop,指出这次要确定的相对关系是,item1的底边与item2的顶边。

     那么他们具体是什么关系呢?就是由related,mutiplier,constant决定的了,按照公式

item1.attribute = multiplier * item.attribute + constant

这里要多解释一句帮助理解:各种attribute指的还是坐标,相对于左上角的原点。上面的意思就是item1的bottom坐标比item2的top坐标减少20个像素,所以constant是负数。

     同样,如果想让item1的宽度是item2的一半多5,则有

NSLayoutConstraint *item1Width =[NSLayoutConstraint constraintWithItem:item1 

attribute:NSLayoutAttributeWidth 

relatedBy:NSLayoutRelationEqual 

toItem:item2 

attribute:NSLayoutAttributeWidth 

multiplier:0.5 constant:5];

     再补充一点,如果我们想确定的属性不需要任何想item2的参照物,比如固定item1的宽度就是80,那么只把参照物item2设置为nil就好:

NSLayoutConstraint *item1Width =[NSLayoutConstraint constraintWithItem:item1 

attribute:NSLayoutAttributeWidth 

relatedBy:NSLayoutRelationEqual 

toItem:nil 

attribute:NSLayoutAttributeWidth 

multiplier:1.0 constant:80];


则 item1.NSLayoutAttributeWidth = constant

**别把multiplier设置为0;

**可以把全部属性设置完成后,[self addConstraints: @[atrributeBottom,item1Width] ];一起加入到控件中

**一定要保证已经将控件添加到公共的superView中了


done!






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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值