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

我们除了在

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

//
//  ViewController.m
//  自动布局代码版
//
//  Created by Biaoac on 16/3/26.
//  Copyright © 2016年 scsys. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()

@end
//  使用 storyBoard ID  找到控制器
//    UIStoryboard *s = [UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]];

//    ViewController *vc = [s instantiateViewControllerWithIdentifier:@"ViewController"];

/*
 //    使用storyboard 跳转页面   也可以用代码跳转
 //    右键拖拽 按钮  到另一个视图控制器  会弹出:
 1.show(push)
 2.present(模态)
 3.popover(ipad 弹出列表)
 */

/*
 横向:距离父视图左侧100、视图本身的宽度最小时100距离父视图右侧是100
 竖向:距离父视图顶部是150、视图本身高度最小是30

 使用可视化格式语言:VFL : Visual format language  描述

 H:表示的是水平方向,
 V:表示的是垂直方向;

 | :表示父视图

 - :本身表示一段距离

 - 距离 - 表示制定距离

 [字符串表示的视图] 参照视图

 [字符串表示的视图(视图的宽高或者最小最大的宽高、相对宽高)]  注意;小括号千万不要丢掉

 使用代码自动布局(AutorlayOut)的时候 frame就会失效, ——》 不需要再去设置视图的Frame

 使用代码自动布局的时候  需要禁用 translatesAutoresizingMaskIntoConstraints = No;

 使用自动布局的步骤:
 1、translatesAutoresizingMaskIntoConstraints = No;
 2、绑定视图与字符串
 3、添加约束

 */

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
//    [self demo1];
//    [self demo2];
//    [self demo3];
//    [self demo4];
    [self demo5];
}

/**
 *  创建视图的方法
 *
 *  @param view  需要创建视图的类名 字符串
 *  @param sView 添加到的目标 父视图
 *
 *  @return 创建好 并且添加到父视图上的 视图
 */

//在这里我们把创建视图的方法封装起来,在demo2.3、4、5、里使用
- (UIView *)creatView:(NSString *)view addToView:(UIView *)sView{
    UIView *myView = [[NSClassFromString(view) alloc]init];
    myView.translatesAutoresizingMaskIntoConstraints = NO;
    [sView addSubview:myView];
    return myView;
}

//我们先按照正常的流程来一遍
- (void)demo1{

    self.view.backgroundColor = [UIColor whiteColor];

    UIView *view = [[UIView alloc]init];
    view.backgroundColor = [UIColor orangeColor];
    [self.view addSubview:view];

    //    可视化语言:
    //    1、禁用
    view.translatesAutoresizingMaskIntoConstraints = NO;
    //    2、绑定视图和字符串
    NSDictionary *dic = NSDictionaryOfVariableBindings(view);
    //    3、添加约束
    /**
     *
     *    VisualFormat  VFL语句
     *    Options:基于哪个方向去布局
     *    metrics :绑定数值(NSNumber)与字符串
     *    views : 绑定视图与字符串的
     */
    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-100-[view(>=100)]-100-|" options:NSLayoutFormatAlignAllLeft metrics:nil views:dic]];
    //  H:|-100-[view(>=100)]-100-|
    //  V:|-150-[view(40)]
    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-150-[view(40)]" options:NSLayoutFormatAlignAllLeft metrics:nil views:dic]];

}
//然后我们在demo1的基础上又添加了一个View
- (void)demo2{

    UIView *view1 = [self creatView:@"UIView" addToView:self.view];
    view1.backgroundColor = [UIColor redColor];
    UIView *view2 = [self creatView:@"UIView" addToView:self.view];
    view2.backgroundColor = [UIColor cyanColor];
    //    2.绑定
    NSDictionary *dic = NSDictionaryOfVariableBindings(view1,view2);
    //    3.添加约束

    //view1:  //  H:|-100-[view1(>=100)]-100-|
    //  V:|-150-[view1(40)]
    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-100-[view1(>=100)]-100-|" options:NSLayoutFormatAlignAllLeft metrics:nil views:dic]];
    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-150-[view1(40)]" options:NSLayoutFormatAlignAllLeft metrics:nil views:dic]];
    //view2:   //   H:|-100-[view1(>=100)]-100-|
    //   V:[view1]-50-[view2(view1)]
    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-100-[view2(>=100)]-100-|" options:NSLayoutFormatAlignAllLeft metrics:nil views:dic]];
    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[view1]-50-[view2(view1)]" options:NSLayoutFormatAlignAllLeft metrics:nil views:dic]];

}
//研究发现: 两个视图竖向是有交集的  我们就做了一下优化
- (void)demo3{

    UIView *view1 = [self creatView:@"UIView" addToView:self.view];
    view1.backgroundColor = [UIColor redColor];
    UIView *view2 = [self creatView:@"UIView" addToView:self.view];
    view2.backgroundColor = [UIColor cyanColor];
    //    2.绑定
    NSDictionary *dic = NSDictionaryOfVariableBindings(view1,view2);
    //    3.添加约束

    //view1:  //  H:|-100-[view1(>=100)]-100-|
    //  V:|-150-[view1(40)]
    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-100-[view1(>=100)]-100-|" options:NSLayoutFormatAlignAllLeft metrics:nil views:dic]];

    //view2:   //   H:|-100-[view1(>=100)]-100-|
    //   V:[view1]-50-[view2(view1)]
    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-100-[view2(>=100)]-100-|" options:NSLayoutFormatAlignAllLeft metrics:nil views:dic]];
    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-150-[view1(40)]-50-[view2(view1)]" options:NSLayoutFormatAlignAllLeft metrics:nil views:dic]];

}
//继续优化,使代码变的更加清晰,
- (void)demo4{

    UIView *view1 = [self creatView:@"UIView" addToView:self.view];
    view1.backgroundColor = [UIColor redColor];
    UIView *view2 = [self creatView:@"UIView" addToView:self.view];
    view2.backgroundColor = [UIColor cyanColor];
    NSDictionary *dic = NSDictionaryOfVariableBindings(view1,view2);
    //    /所有VFL语句的数组
    NSArray *constriants = @[@"H:|-100-[view1(>=100)]-100-|",@"H:|-100-[view2(>=100)]-100-|",@"V:|-150-[view1(40)]-50-[view2(view1)]"];
    for (int i=0; i<constriants.count; i++) {
        [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:constriants[i] options:NSLayoutFormatAlignAllLeft metrics:nil views:dic]];
    }

}

//这次我们加上了 metrics  参数的使用   是用来绑定参数和字符串的方法 和绑定UIView是一样的
- (void)demo5{
    UIView *view1 = [self creatView:@"UIView" addToView:self.view];
    UIView *view2 = [self creatView:@"UIView" addToView:self.view];
    UIView *view3 = [self creatView:@"UIView" addToView:self.view];
    UIView *view4 = [self creatView:@"UIView" addToView:self.view];
    NSDictionary *dic = NSDictionaryOfVariableBindings(view1,view2,view3,view4);
    NSNumber *leftSpace = @100;
    NSNumber *rightSpace = @100;
    NSNumber *view1TopSpace = @150;
    NSNumber *view1MinWidth = @100;
    NSNumber *view1Hight = @40;
    NSNumber *view2TopSpace = @50;

    NSDictionary *metrics = NSDictionaryOfVariableBindings(leftSpace,rightSpace,view1MinWidth,view1Hight,view1TopSpace,view2TopSpace);

    NSArray *constraints = @[@"H:|-leftSpace-[view1(>=view1MinWidth)]-rightSpace-|",@"H:|-leftSpace-[view2(view1)]-rightSpace-|",@"V:|-view1TopSpace-[view1(view1Hight)]-view2TopSpace-[view2(view1)]"];
    for (int i=0; i<constraints.count; i++) {
        [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:constraints[i] options:NSLayoutFormatAlignAllLeft metrics:metrics views:dic]];
    }

}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

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

时间: 2024-11-08 06:48:33

storyBoard升级版 -在代码中使用约束的相关文章

代码手动修改约束(AutoLayout)

当使用xib或storyBoard构建项目,并使用了AutoLayout之后,当需要为视图添加动画,或者手动更改视图的frame的时候,就需要修改约束啦.别以为代码中修改约束很麻烦,其实还蛮简单的啦. 例如: 跟随键盘弹出的ToolBar,原来在视图底部,当键盘弹出时,ToolBar跟随键盘弹出 首先将ToolBar到底部的约束添加一个IBOutlet @property (weak, nonatomic) IBOutlet NSLayoutConstraint *toolViewBottomC

代码中的事务约束

在对数据库的操作中,有时一个操作往往涉及到多张表,为了避免出现向5张表中插入记录,结果插入到第三张的时候出错,结果最后导致第一二张表已插入数据,而后面三张没有插入所带来的数据不一致的情况,我们在写代码的时候需要用事务来约束. 如下: //事物,保证数据的一致性 using (TransactionScope tr = new TransactionScope()) { DbHelper.ExecuteSql("insert into T_student values('lidan',23)&qu

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

如果是viewControl则AutoLayout适配写在- (void)updateViewConstraints方法中修改约束: 如果是view则AutoLayout适配 则在- (void)updateConstraints方法中修改. 可以直接把视图的约束像拖控件一样拖成属性直接在下面的方法里更改即可 //遍历self.myView控件中的约束,找到NSLayoutAttributeHeight控件高度这个约束关系,然后修改 -(void)updateViewConstraints {

iOS 自动布局扩展应用:代码中动态调整布局常量

一.设计需求 iOS Storyboard 自动布局技术,是iOS 6才出来的新技术,相当于多屏幕分辩率下自适应的技术. 但是一些复杂情况还是难处理. 比如有一个界面需求,进度条上显示标签,这个需求不难,难的是显要在显示表格框内,在各种机型显示正常. 最初设定是垂直居中向上偏15个像素 这是iPhone 4S 显示效果,下面与滑块还有错位 但是在iPhone 6下显示,下面有错位,但是上面留空太多 但如果把偏移量设为21.则出现另一种情况. 大屏幕的手机显示完美. 但是iPhone 4S下就错位

利用代码添加autolayout约束

1.概述 通常我们通过storyboard能够完成的,代码也能够完成,所以这里介绍下代码实现约束的添加,通常我们不这么干(在不使用第三方框架的情况下,使用系统自带的类添加约束特别繁琐),所以这里仅仅简单介绍下代码实现原理 2.实现效果 实现效果  纯OC代码  在storyboard中的一条约束在代码中的体现就是一个约束对象,所以添加在storyboard上添加一条约束,相当于创建了一个约束对象并将该约束对象添加到对应的视图上 第一步:创建子控件视图 第二步:禁用子控件的autoresizing

使用autoLayout布局view,在代码中修改frame解决方案

在xib或者storyBoard中给aView使用autoLayout设定了约束,但是想让aView做一个简单的动画,比如从约束的A位置(0,0,100,100)移动到B位置(0,66,100,100)的简单动画. 那么你会发现,如果在xib或者storyBoard中设定了约束,在代码中直接修改aView的frame行不通的. 实现结果就是在ios7上没问题,但是在ios8上发现aView从A移动到B,但是又返回A(具体差别还没找到) 解决方案: loginViewTopConstraint =

使用代码创建AutoLayout约束

使用代码创建AutoLayout约束 1.代码创建约束的步骤 2.代码创建约束的常用方法 3.代码创建约束的原则 4.禁用Autoresizing的原因 5. 设置相对状态栏的约束,使用self.topLayoutGuide 6.通过AutoLayout实现动画 拿到高度约束(self.viewHconstraint)--修改constant值(self.viewHconstraint += 100;)--在动画中[view layoutIfNeeded]. 7.关于自动布局的相关知识总结: 7

ArcGIS API for Silverlight代码中使用Template模板

原文:ArcGIS API for Silverlight代码中使用Template模板 在项目开发中,会遇到点选中聚焦闪烁效果,但是因为在使用Symbol的时候,会设置一定的OffSetX和OffSetY,所以聚焦闪烁的时候,有些情况下,会出现闪烁点的位置和Symbol的位置不重叠现象,下面的方法就是解决这个问题的. 1.在Silverlight项目中新建一个文件夹Template,新建一个DefaultMarkerSymbol.xaml的Silverlight资源字典文件,如下图: 2.打开

IOS开发之Bug--使用xib的自动布局和代码中修改遇到的bug

首先,在xib中约束了宽高22,但是需要代码动态重设,所以一开始如下设置,但是实际显示的仍然是22,而不是重设的值: 然后直接拿xib的将布局约束对象拖线重新通过代码重设约束值,虽然打印的结果宽高值是22,但是显示效果是33: