一谈到Autolayout,初学者肯定想到的是IB中使用拖拽啊,pin啊各种鼠标操作来进行添加各种约束。

今天我们要聊得是如何利用代码来添加视图间的约束。

我们来看一个例子:

(Objective-C代码)

UIView* v1 = [[UIView alloc] initWithFrame:CGRectMake(, , , )];
v1.backgroundColor = [UIColor colorWithRed: green:. blue: alpha:];
UIView* v2 = [UIView new];
v2.backgroundColor = [UIColor colorWithRed:. green: blue: alpha:];
UIView* v3 = [UIView new];
v3.backgroundColor = [UIColor colorWithRed: green: blue: alpha:];
[mainview addSubview: v1];
[v1 addSubview: v2];
[v1 addSubview: v3]; v2.translatesAutoresizingMaskIntoConstraints = NO;
v3.translatesAutoresizingMaskIntoConstraints = NO; [v1 addConstraint:
[NSLayoutConstraint
constraintWithItem:v2 attribute:NSLayoutAttributeLeft
relatedBy:
toItem:v1 attribute:NSLayoutAttributeLeft
multiplier: constant:]]; [v1 addConstraint:
[NSLayoutConstraint
constraintWithItem:v2 attribute:NSLayoutAttributeRight
relatedBy:
toItem:v1 attribute:NSLayoutAttributeRight
multiplier: constant:]]; [v1 addConstraint:
[NSLayoutConstraint
constraintWithItem:v2 attribute:NSLayoutAttributeTop
relatedBy:
toItem:v1 attribute:NSLayoutAttributeTop
multiplier: constant:]]; [v2 addConstraint:
[NSLayoutConstraint
constraintWithItem:v2 attribute:NSLayoutAttributeHeight
relatedBy:
toItem:nil attribute:
multiplier: constant:]]; [v3 addConstraint:
[NSLayoutConstraint
constraintWithItem:v3 attribute:NSLayoutAttributeWidth
relatedBy:
toItem:nil attribute:
multiplier: constant:]]; [v3 addConstraint:
[NSLayoutConstraint
constraintWithItem:v3 attribute:NSLayoutAttributeHeight
relatedBy:
toItem:nil attribute:
multiplier: constant:]]; [v1 addConstraint:
[NSLayoutConstraint
constraintWithItem:v3 attribute:NSLayoutAttributeRight
relatedBy:
toItem:v1 attribute:NSLayoutAttributeRight
multiplier: constant:]]; [v1 addConstraint:
[NSLayoutConstraint
constraintWithItem:v3 attribute:NSLayoutAttributeBottom
relatedBy:
toItem:v1 attribute:NSLayoutAttributeBottom
multiplier: constant:]];

(Swift代码 iOS9)

let v1 = UIView(frame:CGRectMake(, , , ))
v1.backgroundColor = UIColor(red: , green: 0.4, blue: , alpha: )
let v2 = UIView()
v2.backgroundColor = UIColor(red: 0.5, green: , blue: , alpha: )
let v3 = UIView()
v3.backgroundColor = UIColor(red: , green: , blue: , alpha: )
mainview.addSubview(v1)
v1.addSubview(v2)
v1.addSubview(v3) v2.translatesAutoresizingMaskIntoConstraints = false
v3.translatesAutoresizingMaskIntoConstraints = false v1.addConstraint(
NSLayoutConstraint(item: v2,
attribute: .Leading,
relatedBy: .Equal,
toItem: v1,
attribute: .Leading,
multiplier: , constant: )
) v1.addConstraint(
NSLayoutConstraint(item: v2,
attribute: .Trailing,
relatedBy: .Equal,
toItem: v1,
attribute: .Trailing,
multiplier: , constant: )
) v1.addConstraint(
NSLayoutConstraint(item: v2,
attribute: .Top,
relatedBy: .Equal,
toItem: v1,
attribute: .Top,
multiplier: , constant: )
) v2.addConstraint(
NSLayoutConstraint(item: v2,
attribute: .Height,
relatedBy: .Equal,
toItem: nil,
attribute: .NotAnAttribute,
multiplier: , constant: )
) v3.addConstraint(
NSLayoutConstraint(item: v3,
attribute: .Width,
relatedBy: .Equal,
toItem: nil,
attribute: .NotAnAttribute,
multiplier: , constant: )
) v3.addConstraint(
NSLayoutConstraint(item: v3,
attribute: .Height,
relatedBy: .Equal,
toItem: nil,
attribute: .NotAnAttribute,
multiplier: , constant: )
) v1.addConstraint(
NSLayoutConstraint(item: v3,
attribute: .Trailing,
relatedBy: .Equal,
toItem: v1,
attribute: .Trailing,
multiplier: , constant: )
) v1.addConstraint(
NSLayoutConstraint(item: v3,
attribute: .Bottom,
relatedBy: .Equal,
toItem: v1,
attribute: .Bottom,
multiplier: , constant: )
)

运行效果:

(竖屏)

(横屏)

看了以上代码后,你肯定要疯了,那么多约束。。。

下面,我们就来逐一分析:

我们先来看一下这段代码

OC

v3 = [[UIView alloc] initWithFrame:CGRectMake(v1.bounds.size.width-,
v1.bounds.size.height-,
, )];

Swift

let v3 = UIView(frame:CGRectMake(
v1.bounds.width-, v1.bounds.height-, , ))

这段代码很清楚地表达了:v3是宽高各20,并且位置在v1的右下角,其原点距离v1的右下角

坐标x,y各偏移20,也就是我们上图中看到的大红色矩形。

约束的API语句有时候是很冗长的,看上去很难懂。

为此,Apple发明了可视化格式(Visual Format)来便于理解。

看看下面的这个例子:

@"V:|[v2(10)]"

上面的表达式中,V:表示是垂直方向上的约束,同理,H:表示水平方向上约束。

管道符|代表父视图。

中括号内是要添加约束的视图变量名。

所以,这里的约束清晰地表达: v2和父视图顶端对齐,并且v2的高度是10。

iOS编程(双语版)-视图-Autolayout代码初步的更多相关文章

  1. iOS编程(双语版) - 视图 - 手工代码(不使用向导)创建视图

    如何创建一个空的项目,最早的时候XCode的项目想到中,还有Empty Application template这个选项,后来Apple把它 给去掉了. 我们创建一个单视图项目. 1) 删除main. ...

  2. iOS编程(双语版) - 视图 - 基本概念

    1. 什么是视图? 视图显示为手机上的一块矩形区域,管理该区域的所有屏幕显示,它是UIView或者UIView的子类. 视图既可以从xib生成,也可以用代码生成. 2. 窗口 窗口是UIWindow或 ...

  3. iOS编程(双语版)-视图-Frame/Bounds/Center

    1. Frame 每个视图都有一个frame属性,它是CGRect结构,它描述了视图所在的矩形在其父视图中的位置. (屏幕坐标系默认的原点在左上角,x轴向右伸展,y轴向下伸展) 设置frame通常通过 ...

  4. iOS编程(双语版) - 视图 - Transform(转换)

    视图有一个transform属性,它描述了应该如何绘制该视图. 该属性是CGAffineTransform结构体,它代表了3 x 3的变换矩阵(线性代数). 下面的代码让两个矩形视图旋转45度 (Ob ...

  5. iOS编程——经过UUID和KeyChain来代替Mac地址实现iOS设备的唯一标示(OC版)

    iOS编程——通过UUID和KeyChain来代替Mac地址实现iOS设备的唯一标示(OC版) 很多的应用都需要用到手机的唯一标示,而且要求这个唯一标示不能因为应用app的卸载或者改变而变化. 在iO ...

  6. 新书《iOS编程(第6版)》抢鲜试读

    我最近翻译了Big Nerd Ranch的<iOS编程(第6版)>.我用了大半年时间,尽可能做到通顺易懂.不足之处请大家多多指正.感谢辛苦审校的丁道骏同学. 这本书得过Jolt大奖,原书在 ...

  7. IOS编程User Interface基础

    IOS编程之User Interface基础 目录 概述 相关概念 常见问题 状态栏的隐藏 应用图标的设置 概述 IOS用户界面是APP呈现给用户最直观.最常用的方式,因此学会用户界面的编程是学习IO ...

  8. python核心编程第二版笔记

    python核心编程第二版笔记由网友提供:open168 python核心编程--笔记(很详细,建议收藏) 解释器options:1.1 –d   提供调试输出1.2 –O   生成优化的字节码(生成 ...

  9. iOS,Core Animation--负责视图的复合功能

    简介 UIKit API UIKit是一组Objective-C API,为线条图形.Quartz图像和颜色操作提供Objective-C 封装,并提供2D绘制.图像处理及用户接口级别的动画.    ...

随机推荐

  1. MySQL主从复制的原理及配置方法(比较详细)

    MySQL 的数据库的高可用性的架构大概有以下几种:集群,读写分离,主备.而后面两种都是通过复制来实现的.下面将简单介绍复制的原理及配置,以及一些常见的问题 一.复制的原理 MySQL 复制基于主服务 ...

  2. CentOS 安装 Jenkins

    原文:https://www.sunjianhua.cn/archives/centos-jenkins.html 1.更换源 mv /etc/yum.repos.d/CentOS-Base.repo ...

  3. java获取视频播第一帧

    FFMPEG 功能很强大,做视频必备的软件.大家可通过 http://ffmpeg.org/ 了解.Windows版本的软件,可通过 http://ffmpeg.zeranoe.com/builds/ ...

  4. cocos2d-x中使用CCOrbitCamera做水平翻转

    项目中需要用到水平翻转效果,这里偷懒了-   首先翻转,它只是转到了180度,多了就觉得很奇怪了. 所以这里设定就是先从0 ~ 90度,然后再从270 ~ 360,90 – 270 视觉上是感觉不到变 ...

  5. Adapter数据变化改变现有View的实现原理及案例

    首先说说Adapter详细的类的继承关系.例如以下图 Adapte为接口它的实现类的对象作为AdapterView和View的桥梁,Adapter是装载了View(比方ListView和girdVie ...

  6. Orchard之Module升级

    在上一篇中,我们提到了 Migrations,这一篇稍微衍生一下. 1:Migrations 是什么 Orchard 提供了模块升级的功能,即,如果我们模块发布后,需要进行升级,我们可以通过编码来实现 ...

  7. Java和C#差异点

    语法:----------------------------------------------------------1. Java的byte为-128~127相当于c#的sbyte,c#byte ...

  8. linux rename命令批量修改文件名

    修改文件名可以用mv命令来实现 mv filename1 filename2 1 但如果批量修改还是使用rename命令更为方便 现在我们有a b c d 四个文件 增加后缀 rename 's/$/ ...

  9. 如何使用pycharm调试(debug) django的测试用例?

    一.django应用或者flask应用的调试: 结合debug模式,在代码处添加断点,即可实现断点调试功能 二. django应用或者flask应用测试用例的调试: 一般django应用的测试用例执行 ...

  10. MySQL 查询优化简记

    今天尝试对一张MySQL表做查询优化, 500W数据 但是发现加了索引比不加索引使用全表扫描还慢, 上网查, 据说是因为需要回表, 因为没有用到 using index(覆盖索引), 而回表查询是随机 ...