storyBoard升级版 -在代码中使用约束

Posted Biaoac

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了storyBoard升级版 -在代码中使用约束相关的知识,希望对你有一定的参考价值。

我们除了在

storyBoard中可以把控件进行约束,在代码中我们同样可以对其进行约束,使得你的app不管是在什么设备中,他的界面设计都不会发生改变

 

   

  1 //
  2 //  ViewController.m
  3 //  自动布局代码版
  4 //
  5 //  Created by Biaoac on 16/3/26.
  6 //  Copyright © 2016年 scsys. All rights reserved.
  7 //
  8 
  9 #import "ViewController.h"
 10 
 11 @interface ViewController ()
 12 
 13 @end
 14 //  使用 storyBoard ID  找到控制器
 15 //    UIStoryboard *s = [UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]];
 16 
 17 //    ViewController *vc = [s instantiateViewControllerWithIdentifier:@"ViewController"];
 18 
 19 /*
 20  //    使用storyboard 跳转页面   也可以用代码跳转
 21  //    右键拖拽 按钮  到另一个视图控制器  会弹出:
 22  1.show(push)
 23  2.present(模态)
 24  3.popover(ipad 弹出列表)
 25  */
 26 
 27 /*
 28  横向:距离父视图左侧100、视图本身的宽度最小时100距离父视图右侧是100
 29  竖向:距离父视图顶部是150、视图本身高度最小是30
 30  
 31  使用可视化格式语言:VFL : Visual format language  描述
 32  
 33  H:表示的是水平方向,
 34  V:表示的是垂直方向;
 35  
 36  | :表示父视图
 37  
 38  - :本身表示一段距离
 39  
 40  - 距离 - 表示制定距离
 41  
 42  [字符串表示的视图] 参照视图
 43  
 44  [字符串表示的视图(视图的宽高或者最小最大的宽高、相对宽高)]  注意;小括号千万不要丢掉
 45  
 46  使用代码自动布局(AutorlayOut)的时候 frame就会失效, ——》 不需要再去设置视图的Frame
 47  
 48  使用代码自动布局的时候  需要禁用 translatesAutoresizingMaskIntoConstraints = No;
 49  
 50  使用自动布局的步骤:
 51  1、translatesAutoresizingMaskIntoConstraints = No;
 52  2、绑定视图与字符串
 53  3、添加约束
 54  
 55  
 56  
 57  
 58  
 59  
 60  */
 61 
 62 @implementation ViewController
 63 
 64 - (void)viewDidLoad {
 65     [super viewDidLoad];
 66 //    [self demo1];
 67 //    [self demo2];
 68 //    [self demo3];
 69 //    [self demo4];
 70     [self demo5];
 71 }
 72 
 73 
 74 /**
 75  *  创建视图的方法
 76  *
 77  *  @param view  需要创建视图的类名 字符串
 78  *  @param sView 添加到的目标 父视图
 79  *
 80  *  @return 创建好 并且添加到父视图上的 视图
 81  */
 82 
 83 //在这里我们把创建视图的方法封装起来,在demo2.3、4、5、里使用
 84 - (UIView *)creatView:(NSString *)view addToView:(UIView *)sView{
 85     UIView *myView = [[NSClassFromString(view) alloc]init];
 86     myView.translatesAutoresizingMaskIntoConstraints = NO;
 87     [sView addSubview:myView];
 88     return myView;
 89 }
 90 
 91 //我们先按照正常的流程来一遍
 92 - (void)demo1{
 93     
 94     self.view.backgroundColor = [UIColor whiteColor];
 95     
 96     
 97     UIView *view = [[UIView alloc]init];
 98     view.backgroundColor = [UIColor orangeColor];
 99     [self.view addSubview:view];
100     
101     //    可视化语言:
102     //    1、禁用
103     view.translatesAutoresizingMaskIntoConstraints = NO;
104     //    2、绑定视图和字符串
105     NSDictionary *dic = NSDictionaryOfVariableBindings(view);
106     //    3、添加约束
107     /**
108      *
109      *    VisualFormat  VFL语句
110      *    Options:基于哪个方向去布局
111      *    metrics :绑定数值(NSNumber)与字符串
112      *    views : 绑定视图与字符串的
113      */
114     [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-100-[view(>=100)]-100-|" options:NSLayoutFormatAlignAllLeft metrics:nil views:dic]];
115     //  H:|-100-[view(>=100)]-100-|
116     //  V:|-150-[view(40)]
117     [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-150-[view(40)]" options:NSLayoutFormatAlignAllLeft metrics:nil views:dic]];
118     
119     
120 
121 }
122 //然后我们在demo1的基础上又添加了一个View
123 - (void)demo2{
124     
125     UIView *view1 = [self creatView:@"UIView" addToView:self.view];
126     view1.backgroundColor = [UIColor redColor];
127     UIView *view2 = [self creatView:@"UIView" addToView:self.view];
128     view2.backgroundColor = [UIColor cyanColor];
129     //    2.绑定
130     NSDictionary *dic = NSDictionaryOfVariableBindings(view1,view2);
131     //    3.添加约束
132     
133     //view1:  //  H:|-100-[view1(>=100)]-100-|
134     //  V:|-150-[view1(40)]
135     [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-100-[view1(>=100)]-100-|" options:NSLayoutFormatAlignAllLeft metrics:nil views:dic]];
136     [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-150-[view1(40)]" options:NSLayoutFormatAlignAllLeft metrics:nil views:dic]];
137     //view2:   //   H:|-100-[view1(>=100)]-100-|
138     //   V:[view1]-50-[view2(view1)]
139     [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-100-[view2(>=100)]-100-|" options:NSLayoutFormatAlignAllLeft metrics:nil views:dic]];
140     [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[view1]-50-[view2(view1)]" options:NSLayoutFormatAlignAllLeft metrics:nil views:dic]];
141     
142     
143     
144     
145 }
146 //研究发现: 两个视图竖向是有交集的  我们就做了一下优化
147 - (void)demo3{
148     
149 
150     UIView *view1 = [self creatView:@"UIView" addToView:self.view];
151     view1.backgroundColor = [UIColor redColor];
152     UIView *view2 = [self creatView:@"UIView" addToView:self.view];
153     view2.backgroundColor = [UIColor cyanColor];
154     //    2.绑定
155     NSDictionary *dic = NSDictionaryOfVariableBindings(view1,view2);
156     //    3.添加约束
157     
158     //view1:  //  H:|-100-[view1(>=100)]-100-|
159     //  V:|-150-[view1(40)]
160     [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-100-[view1(>=100)]-100-|" options:NSLayoutFormatAlignAllLeft metrics:nil views:dic]];
161     
162     //view2:   //   H:|-100-[view1(>=100)]-100-|
163     //   V:[view1]-50-[view2(view1)]
164     [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-100-[view2(>=100)]-100-|" options:NSLayoutFormatAlignAllLeft metrics:nil views:dic]];
165     [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-150-[view1(40)]-50-[view2(view1)]" options:NSLayoutFormatAlignAllLeft metrics:nil views:dic]];
166     
167     
168 }
169 //继续优化,使代码变的更加清晰,
170 - (void)demo4{
171     
172     UIView *view1 = [self creatView:@"UIView" addToView:self.view];
173     view1.backgroundColor = [UIColor redColor];
174     UIView *view2 = [self creatView:@"UIView" addToView:self.view];
175     view2.backgroundColor = [UIColor cyanColor];
176     NSDictionary *dic = NSDictionaryOfVariableBindings(view1,view2);
177     //    /所有VFL语句的数组
178     NSArray *constriants = @[@"H:|-100-[view1(>=100)]-100-|",@"H:|-100-[view2(>=100)]-100-|",@"V:|-150-[view1(40)]-50-[view2(view1)]"];
179     for (int i=0; i<constriants.count; i++) {
180         [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:constriants[i] options:NSLayoutFormatAlignAllLeft metrics:nil views:dic]];
181     }
182     
183     
184 }
185 
186 //这次我们加上了 metrics  参数的使用   是用来绑定参数和字符串的方法 和绑定UIView是一样的
187 - (void)demo5{
188     UIView *view1 = [self creatView:@"UIView" addToView:self.view];
189     UIView *view2 = [self creatView:@"UIView" addToView:self.view];
190     UIView *view3 = [self creatView:@"UIView" addToView:self.view];
191     UIView *view4 = [self creatView:@"UIView" addToView:self.view];
192     NSDictionary *dic = NSDictionaryOfVariableBindings(view1,view2,view3,view4);
193     NSNumber *leftSpace = @100;
194     NSNumber *rightSpace = @100;
195     NSNumber *view1TopSpace = @150;
196     NSNumber *view1MinWidth = @100;
197     NSNumber *view1Hight = @40;
198     NSNumber *view2TopSpace = @50;
199     
200     NSDictionary *metrics = NSDictionaryOfVariableBindings(leftSpace,rightSpace,view1MinWidth,view1Hight,view1TopSpace,view2TopSpace);
201     
202     
203     NSArray *constraints = @[@"H:|-leftSpace-[view1(>=view1MinWidth)]-rightSpace-|",@"H:|-leftSpace-[view2(view1)]-rightSpace-|",@"V:|-view1TopSpace-[view1(view1Hight)]-view2TopSpace-[view2(view1)]"];
204     for (int i=0; i<constraints.count; i++) {
205         [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:constraints[i] options:NSLayoutFormatAlignAllLeft metrics:metrics views:dic]];
206     }
207     
208     
209 }
210 
211 
212 
213 
214 - (void)didReceiveMemoryWarning {
215     [super didReceiveMemoryWarning];
216     // Dispose of any resources that can be recreated.
217 }
218 
219 
220 @end

 

   本人觉得代码中的注释还是很详细的,就不多嘴了,运行的结果如下;(看见没有,我就说没有影响吧

以上是关于storyBoard升级版 -在代码中使用约束的主要内容,如果未能解决你的问题,请参考以下文章

使用swift iOS8通过代码将约束设置到Storyboard中的元素

iOS 在xib或者storyboard中添加AutoLayout后,在代码中修改AutoLayout约束条件

IOS / Autolayout / Objective-C:在引用Storyboard中的元素的代码中创建约束

XCode 6.4 中 iOS8 Storyboard 中缺少约束图标,适用于最初在早期版本的 iOS 下编写的应用程序

使用StoryBoard设置Scrollview的横向滚动不用一行代码哦!!!

将自动布局(约束)从 xib/storyboard 转换为代码? [关闭]