热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

iOS编程(双语版)视图Autolayout代码初步

一谈到Autolayout,初学者肯定想到的是IB中使用拖拽啊,pin啊各种鼠标操作来进行添加各种约束。今天我们要聊得是如何利用代码来添加视图间的约束。我们来看一个例

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

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

我们来看一个例子:

(Objective-C代码)

UIView* v1 = [[UIView alloc] initWithFrame:CGRectMake(100, 111, 132, 194)];
v1.backgroundColor
= [UIColor colorWithRed:1 green:.4 blue:1 alpha:1];
UIView
* v2 = [UIView new];
v2.backgroundColor
= [UIColor colorWithRed:.5 green:1 blue:0 alpha:1];
UIView
* v3 = [UIView new];
v3.backgroundColor
= [UIColor colorWithRed:1 green:0 blue:0 alpha:1];
[mainview addSubview: v1];
[v1 addSubview: v2];
[v1 addSubview: v3];v2.translatesAutoresizingMaskIntoConstraints
= NO;
v3.translatesAutoresizingMaskIntoConstraints
= NO;[v1 addConstraint:[NSLayoutConstraintconstraintWithItem:v2 attribute:NSLayoutAttributeLeftrelatedBy:0toItem:v1 attribute:NSLayoutAttributeLeftmultiplier:1 constant:0]];[v1 addConstraint:[NSLayoutConstraintconstraintWithItem:v2 attribute:NSLayoutAttributeRightrelatedBy:0toItem:v1 attribute:NSLayoutAttributeRightmultiplier:1 constant:0]];[v1 addConstraint:[NSLayoutConstraintconstraintWithItem:v2 attribute:NSLayoutAttributeToprelatedBy:0toItem:v1 attribute:NSLayoutAttributeTopmultiplier:1 constant:0]];[v2 addConstraint:[NSLayoutConstraintconstraintWithItem:v2 attribute:NSLayoutAttributeHeightrelatedBy:0toItem:nil attribute:0multiplier:1 constant:10]];[v3 addConstraint:[NSLayoutConstraintconstraintWithItem:v3 attribute:NSLayoutAttributeWidthrelatedBy:0toItem:nil attribute:0multiplier:1 constant:20]];[v3 addConstraint:[NSLayoutConstraintconstraintWithItem:v3 attribute:NSLayoutAttributeHeightrelatedBy:0toItem:nil attribute:0multiplier:1 constant:20]];[v1 addConstraint:[NSLayoutConstraintconstraintWithItem:v3 attribute:NSLayoutAttributeRightrelatedBy:0toItem:v1 attribute:NSLayoutAttributeRightmultiplier:1 constant:0]];[v1 addConstraint:[NSLayoutConstraintconstraintWithItem:v3 attribute:NSLayoutAttributeBottomrelatedBy:0toItem:v1 attribute:NSLayoutAttributeBottommultiplier:1 constant:0]];

(Swift代码 iOS9)

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

运行效果:

(竖屏)

(横屏)

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

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

 我们先来看一下这段代码

OC

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

Swift

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

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

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

 

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

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

看看下面的这个例子:

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

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

管道符|代表父视图。

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

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

 



推荐阅读
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 本文详细介绍了GetModuleFileName函数的用法,该函数可以用于获取当前模块所在的路径,方便进行文件操作和读取配置信息。文章通过示例代码和详细的解释,帮助读者理解和使用该函数。同时,还提供了相关的API函数声明和说明。 ... [详细]
  • 本文总结了Java中日期格式化的常用方法,并给出了示例代码。通过使用SimpleDateFormat类和jstl fmt标签库,可以实现日期的格式化和显示。在页面中添加相应的标签库引用后,可以使用不同的日期格式化样式来显示当前年份和月份。该文提供了详细的代码示例和说明。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 利用Visual Basic开发SAP接口程序初探的方法与原理
    本文介绍了利用Visual Basic开发SAP接口程序的方法与原理,以及SAP R/3系统的特点和二次开发平台ABAP的使用。通过程序接口自动读取SAP R/3的数据表或视图,在外部进行处理和利用水晶报表等工具生成符合中国人习惯的报表样式。具体介绍了RFC调用的原理和模型,并强调本文主要不讨论SAP R/3函数的开发,而是针对使用SAP的公司的非ABAP开发人员提供了初步的接口程序开发指导。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 本文介绍了最长上升子序列问题的一个变种解法,通过记录拐点的位置,将问题拆分为左右两个LIS问题。详细讲解了算法的实现过程,并给出了相应的代码。 ... [详细]
  • 如何搭建Java开发环境并开发WinCE项目
    本文介绍了如何搭建Java开发环境并开发WinCE项目,包括搭建开发环境的步骤和获取SDK的几种方式。同时还解答了一些关于WinCE开发的常见问题。通过阅读本文,您将了解如何使用Java进行嵌入式开发,并能够顺利开发WinCE应用程序。 ... [详细]
  • VSCode快速查看函数定义和代码追踪方法详解
    本文详细介绍了在VSCode中快速查看函数定义和代码追踪的方法,包括跳转到定义位置的三种方式和返回跳转前的位置的快捷键。同时,还介绍了代码追踪插件的使用以及对符号跳转的不足之处。文章指出,直接跳转到定义和实现的位置对于程序员来说非常重要,但需要语言本身的支持。以TypeScript为例,按下F12即可跳转到函数的定义处。 ... [详细]
author-avatar
全仕介个
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有