iOS编程(双语版)-视图-Autolayout代码初步
一谈到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代码初步的更多相关文章
- iOS编程(双语版) - 视图 - 手工代码(不使用向导)创建视图
如何创建一个空的项目,最早的时候XCode的项目想到中,还有Empty Application template这个选项,后来Apple把它 给去掉了. 我们创建一个单视图项目. 1) 删除main. ...
- iOS编程(双语版) - 视图 - 基本概念
1. 什么是视图? 视图显示为手机上的一块矩形区域,管理该区域的所有屏幕显示,它是UIView或者UIView的子类. 视图既可以从xib生成,也可以用代码生成. 2. 窗口 窗口是UIWindow或 ...
- iOS编程(双语版)-视图-Frame/Bounds/Center
1. Frame 每个视图都有一个frame属性,它是CGRect结构,它描述了视图所在的矩形在其父视图中的位置. (屏幕坐标系默认的原点在左上角,x轴向右伸展,y轴向下伸展) 设置frame通常通过 ...
- iOS编程(双语版) - 视图 - Transform(转换)
视图有一个transform属性,它描述了应该如何绘制该视图. 该属性是CGAffineTransform结构体,它代表了3 x 3的变换矩阵(线性代数). 下面的代码让两个矩形视图旋转45度 (Ob ...
- iOS编程——经过UUID和KeyChain来代替Mac地址实现iOS设备的唯一标示(OC版)
iOS编程——通过UUID和KeyChain来代替Mac地址实现iOS设备的唯一标示(OC版) 很多的应用都需要用到手机的唯一标示,而且要求这个唯一标示不能因为应用app的卸载或者改变而变化. 在iO ...
- 新书《iOS编程(第6版)》抢鲜试读
我最近翻译了Big Nerd Ranch的<iOS编程(第6版)>.我用了大半年时间,尽可能做到通顺易懂.不足之处请大家多多指正.感谢辛苦审校的丁道骏同学. 这本书得过Jolt大奖,原书在 ...
- IOS编程User Interface基础
IOS编程之User Interface基础 目录 概述 相关概念 常见问题 状态栏的隐藏 应用图标的设置 概述 IOS用户界面是APP呈现给用户最直观.最常用的方式,因此学会用户界面的编程是学习IO ...
- python核心编程第二版笔记
python核心编程第二版笔记由网友提供:open168 python核心编程--笔记(很详细,建议收藏) 解释器options:1.1 –d 提供调试输出1.2 –O 生成优化的字节码(生成 ...
- iOS,Core Animation--负责视图的复合功能
简介 UIKit API UIKit是一组Objective-C API,为线条图形.Quartz图像和颜色操作提供Objective-C 封装,并提供2D绘制.图像处理及用户接口级别的动画. ...
随机推荐
- MySQL主从复制的原理及配置方法(比较详细)
MySQL 的数据库的高可用性的架构大概有以下几种:集群,读写分离,主备.而后面两种都是通过复制来实现的.下面将简单介绍复制的原理及配置,以及一些常见的问题 一.复制的原理 MySQL 复制基于主服务 ...
- CentOS 安装 Jenkins
原文:https://www.sunjianhua.cn/archives/centos-jenkins.html 1.更换源 mv /etc/yum.repos.d/CentOS-Base.repo ...
- java获取视频播第一帧
FFMPEG 功能很强大,做视频必备的软件.大家可通过 http://ffmpeg.org/ 了解.Windows版本的软件,可通过 http://ffmpeg.zeranoe.com/builds/ ...
- cocos2d-x中使用CCOrbitCamera做水平翻转
项目中需要用到水平翻转效果,这里偷懒了- 首先翻转,它只是转到了180度,多了就觉得很奇怪了. 所以这里设定就是先从0 ~ 90度,然后再从270 ~ 360,90 – 270 视觉上是感觉不到变 ...
- Adapter数据变化改变现有View的实现原理及案例
首先说说Adapter详细的类的继承关系.例如以下图 Adapte为接口它的实现类的对象作为AdapterView和View的桥梁,Adapter是装载了View(比方ListView和girdVie ...
- Orchard之Module升级
在上一篇中,我们提到了 Migrations,这一篇稍微衍生一下. 1:Migrations 是什么 Orchard 提供了模块升级的功能,即,如果我们模块发布后,需要进行升级,我们可以通过编码来实现 ...
- Java和C#差异点
语法:----------------------------------------------------------1. Java的byte为-128~127相当于c#的sbyte,c#byte ...
- linux rename命令批量修改文件名
修改文件名可以用mv命令来实现 mv filename1 filename2 1 但如果批量修改还是使用rename命令更为方便 现在我们有a b c d 四个文件 增加后缀 rename 's/$/ ...
- 如何使用pycharm调试(debug) django的测试用例?
一.django应用或者flask应用的调试: 结合debug模式,在代码处添加断点,即可实现断点调试功能 二. django应用或者flask应用测试用例的调试: 一般django应用的测试用例执行 ...
- MySQL 查询优化简记
今天尝试对一张MySQL表做查询优化, 500W数据 但是发现加了索引比不加索引使用全表扫描还慢, 上网查, 据说是因为需要回表, 因为没有用到 using index(覆盖索引), 而回表查询是随机 ...