第十六章 编码方式实现auto layout

来源:互联网 发布:javascript 或运算 编辑:程序博客网 时间:2024/06/10 22:12


一,介绍

        1,在loadView回调中创建布局; 

              如果使用nib创建布局,但是需要在代码中修改,可以在viewDidLoad中修改。


        2,使用Visual Format Language(VFL)语言写布局限制


二,vfl语法

        1,一条语句可以对应多个选项, 比如左右

        2,一条语句只能对应一个方向,即是水平和垂直的都要分成2条语句

        3,@"H:|-0-[imageView]-0-|"            H:代表水平方向; |代表Imageview的container,  -0-即是设置的大小;

              也可以省略为@"H:|[imageView]|"

        4,@"V:[dateLabel]-8-[imageView]-8-[toolbar]"   垂直方向设置间距

        5,设置固定数值的方法  @"V:[someView(==50)]"  即是设置高度为50


三,创建布局限制

       1,使用constraintsWithVisualFormat方法添加

       2,第一个参数添加vfl语句

       3,第二、三个参数暂时可以忽略

       4,第四个参数指定在vfl中的对象名和对象之间的关系;

             

- (void)viewDidLoad{[super viewDidLoad];...NSDictionary *nameMap = @{@"imageView" : self.imageView,@"dateLabel" : self.dateLabel,@"toolbar" : self.toolbar};// imageView is 0 pts from superview at left and right edgesNSArray *horizontalConstraints =[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-0-[imageView]-0-|"options:0metrics:nilviews:nameMap];// imageView is 8 pts from dateLabel at its top edge...// ... and 8 pts from toolbar at its bottom edgeNSArray *verticalConstraints =[NSLayoutConstraint constraintsWithVisualFormat:@"V:[dateLabel]-[imageView]-[toolbar]"options:0metrics:nilviews:nameMap];}

四,添加布局限制

       布局约束应该添加到哪个view?  一般来将,就是布局约束中所有view的最近父view节点;

  如果约束中只有一个view,那约束就加到自己;

  1,发送addConstraints:消息添加布局约束


五,Intrinsic Content Size view本身大小对布局约束的影响

         1,image view本身的图片大小会影响布局约束

         2,可以设置压缩和放大的优先级系数,当为1000的时候,不允许布局约束改变大小

         3,当添加一个优先级较低的小图片到布局中时,会导致另外一个优先级较高的view改变大小

        


六,其他方式

        有些情况下,无法使用vfl语句创建布局约束,比如图片的宽度是高度的1.5倍,这时可以使用NSLayoutConstraint来创建布局之间的相对关系;

       

NSLayoutConstraint *aspectConstraint =[NSLayoutConstraint constraintWithItem:self.imageViewattribute:NSLayoutAttributeWidthrelatedBy:NSLayoutRelationEqualtoItem:self.imageViewattribute:NSLayoutAttributeHeightmultiplier:1.5constant:0.0];

其他的attribute是常量,代表某个布局; relateBy的NSLayoutRelationEqual是指等于;  multiplier代表倍数;

同样你需要把布局约束加到view中:[self.imageView addConstraint:aspectConstraint];


七,NSAutoresizingMaskLayoutConstraint

        在出现autolayout之前,ios使用NSAutoresizingMaskLayoutConstraint,它创建了view和父view之间的关系;

        但它会导致和autolayout之间的冲突;


        解决方式是关闭NSAutoresizingMaskLayoutConstraint;
















0 0