概述

本节我们将较为理论的讲述约束,更准确的说法叫做“AutoLayout”。对于后续章节要学习的内容,本篇文章并非必须,如果你也像我当年一样正在被老板踢屁股赶进度的话,但可掠过本篇。

本篇内容旨在锦上添花,了解完本篇内容后,将会有助于你更加得心应手的使用约束。

“AutoLayout”的官方文档链接如下,以供参考:

https://developer.apple.com/library/archive/documentation/UserExperience/Conceptual/AutolayoutPG/index.html#//apple_ref/doc/uid/TP40010853-CH7-SW1

所有的约束都归结为1个方程

约束是这样实现的:

根据给定元素(x),限定目标元素(y)的位置或大小,既

y =(或≥或≤) ax + b

上图截自苹果官网Auto Layout Guide,我们用这个例子来进行说明。

这个方程约束了红色矩形前边界(左边界)距离蓝色矩形尾边界(右边界)右侧8.0个单位。

RedView.Leading指的是红色矩形的前边界(左边界)“y”,BlueView.trailing指的是蓝色矩形的尾边界(右边界)“x”,其中“a=1.0”,“b=8.0”,方程关系为“=”关系。

一例胜百言

例1:如下图所示,Button的约束为

Button.Leading = 1.0 x SuperView.Leading + 10

Button.Top = 1.0 x SuperView.Top - 16

Button.Width = 0.0 x NotAnAttribute + 18

Button.Height = 0.0 x NotAnAttribute + 12

其中SuperView表示Button所在的容器,也就是Button所在的“黑框”。NotAnAttribute表示一个无意义值,因为乘以了0,所以并不妨碍方程计算。

例2:如下图所示,Button的约束为

Button.Leading = 1.0 x SuperView.Leading + 10

Button.Top = 1.0 x SuperView.Top - 16

Button.Trailing = 1.0 x SuperView.Trailing - 10

Button.Height = 5/3 x Button.Width + 0

其中Button.Width虽然没有在以上约束中明确指出,但是根据Bottom.Leading和Bottom.Trailing的约束,Button.Width就已经确定了(SuperView.Width - 10 x 2)

例3:如下图所示,假设Image的位置和大小已经确定(未在图中显示),则Button的约束为

Button.Leading = 1.0 x Image.Trailing + 10

Button.Trailing = 1.0 x SuperView.Trailing - 5

Button.Top = 1.0 x Image.Top + 0

Button.Bottom = 1.0 x Image.Bottom + 0

例4:如下图所示,Button的约束为

Button.CenterX = 1.0 x SuperView.CenterX + 0

Button.CenterY = 1.0 x SuperView.CenterY + 0

Button.Width = 0.0 x NotAnAttribute + 10

Button.Height = 0.0 x NotAnAttribute + 10

插播一则知识点:固有尺寸(Intrinsic Size)

之前我们说过,约束所有的要义就在于唯一确定UI控件的位置和大小,两者缺一不可

但是我们有时候会发现,如果只约束UI控件的位置,而不约束其大小也是可以的。比如下图,我们只约束了label的左边界和上边界,但xcode并没有报错,只是提示了一个警告。

这到底是为什么呢?

包含文字/图片内容的UI控件都会有固有尺寸,固有尺寸的长宽即文字/图片的原始长宽。当没有约束该UI控件的长宽时,默认使用其固有尺寸。

如下图,如果我们拖入一个ImageView,并只约束其左边界和上边界,会发现xcode有报错,但是当我们给其指定了图片内容后,报错就消失了。

了解了固有尺寸后,我们就可以接着讲收缩/拉伸等级约束了。

View的收缩等级约束表示为:

垂直方向:View.Height <= 0.0 x NotAnAttribute + IntrinsicHeight

水平方向:View.Width <= 0.0 x NotAnAttribute + IntrinsicWidth

View的拉伸等级约束表示为:

垂直方向:View.Height >= 0.0 x NotAnAttribute + IntrinsicHeight

水平方向:View.Width >= 0.0 x NotAnAttribute + IntrinsicWidth

约束等级

一个UI控件一般有多个约束,有时候约束之间会发生冲突(还记得吗?上一节我们就遇到过“收缩等级”约束冲突),每当此时,我们可以删掉其中一个,如果不能删掉。我们还可以设置约束等级(Priority)。约束等级的范围是1~1000,1000等级最高,1等级最小。当2个约束冲突时,等级高的约束可以屏蔽掉等级低的约束。

总结

约束(AutoLayout)的所有内容都归结为1个方程,它能很好的实现在不同设备上的自适应,从而使开发者避免了许多重复性的工作,再加上Xcode的图形化开发功能,真可谓是UI开发的利器。

现在你可以对约束为所欲为了哟~

上一节           回目录          下一节

五、UI开发之核心基础——约束(深入)的更多相关文章

  1. 三、UI开发之核心基础——约束(入门)

    先学个新技能:添加图片控件Image View iOS的图片控件是ImageView,ImageView通过提前载入用户指定的图片资源来显示相应的图片. 所以图片控件的关键信息有3个: 1. Imag ...

  2. 四、UI开发之核心基础——约束(实用)

    概述 本节将会介绍最常用的几种约束,基本可以满足90%以上的UI布局要求. 先附上一份其他优秀博客https://blog.csdn.net/companion_1314/article/detail ...

  3. Pyhton开发【第五篇】:Python基础之杂货铺

    Python开发[第五篇]:Python基础之杂货铺   字符串格式化 Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进 ...

  4. 20155228 实验五 Android开发基础

    20155228 实验五 Android开发基础 实验内容 1.掌握Socket程序的编写: 2.掌握密码技术的使用: 3.设计安全传输系统. 实验要求 1.没有Linux基础的同学建议先学习< ...

  5. Kendo UI开发教程(16): Kendo MVVM 数据绑定(五) Events

    本篇和Kendo UI开发教程(14): Kendo MVVM 数据绑定(三) Click类似,为事件绑定的一般形式.Events绑定支持将ViewModel的方法绑定到DOM元素的事件处理(如鼠标事 ...

  6. Android UI开发第三十五篇——AppCompat实现Action Bar

    每一位Android开发者对Action Bar这种设计都不陌生了,毕竟它已经发布了至少两年了.Android团队发布Action Bar设计规范时同时放出了ActionBar的Api来支持这种设计. ...

  7. Chrome扩展开发之四——核心功能的实现思路

    目录: 0.Chrome扩展开发(Gmail附件管理助手)系列之〇——概述 1.Chrome扩展开发之一——Chrome扩展的文件结构 2.Chrome扩展开发之二——Chrome扩展中脚本的运行机制 ...

  8. Android应用的核心基础

    Android4开发入门经典 之 第二部分:Android应用的核心基础 Android应用中的组件 Application Components Android应用中最主要的组件是: 1:Activ ...

  9. 十二、Android UI开发专题(转)

    http://dev.10086.cn/cmdn/bbs/viewthread.php?tid=18736&page=1#pid89255Android UI开发专题(一) 之界面设计 近期很 ...

随机推荐

  1. ubuntu上Android开发环境及依赖项

    [时间:2018-07] [状态:Open] [关键词:ubuntu,系统安装,开发环境搭建,android,工具集] Ubuntu系统版本:v18.04 LTS c/c++ dev (build-e ...

  2. Airtest iOS测试环境部署

    [本文出自天外归云的博客园] 简介 这个Airtest IDE是通过iOS-Tagent来操作iPhone的,你可以在Airtest IDE里录制脚本来实现自动化操作iPhone 前提 1. 得有个i ...

  3. android sdk manager更新地址

    参考:http://www.oschina.net/question/1399261_195245 android sdk 用久了,想更新到最新的SDK包: 大连东软信息学院镜像服务器地址:- htt ...

  4. Direct3D 11 Tutorial 7:Texture Mapping and Constant Buffers_Direct3D 11 教程7:纹理映射和常量缓冲区

    概述 在上一个教程中,我们为项目引入了照明. 现在我们将通过向我们的立方体添加纹理来构建它. 此外,我们将介绍常量缓冲区的概念,并解释如何使用缓冲区通过最小化带宽使用来加速处理. 本教程的目的是修改中 ...

  5. 通用Mapper新特性:ExampleBuilder 2017年12月18日

    package tk.mybatis.mapper.test.example; import org.apache.ibatis.session.SqlSession; import org.juni ...

  6. org.hibernate.InvalidMappingException: Could not parse mapping document from无法创建sessionFactory

    把 "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd" 改为 "http://hibernate.sourc ...

  7. Webpack+Vue+ES6 前端组件化开发mobile-multi-page应用实战总结和踩坑

    本文版权归博客园和作者吴双本人共同所有 转载和爬虫请注明原文地址 www.cnblogs.com/tdws 一.写在前面 项目上线有一段时间了,一个基于webpack+vue+ES6的手机端多页面应用 ...

  8. 媳妇要转java开发,我该怎么办?

    我是一名5年的java开发者,媳妇是一个5年的软件实施工程师,我们结婚快一年了,这几天她突然对我说,她想转java开发,让我辅导她学习java,我该怎么弄,我心底是不愿意她转开发的,毕竟她年龄也不小了 ...

  9. passwd命令

    passwd命令用于设置用户的认证信息,包括用户密码.密码过期时间等.系统管理者则能用它管理系统用户的密码.只有管理者可以指定用户名称,一般用户只能变更自己的密码. 语法 passwd(选项)(参数) ...

  10. linux操作2

    第2天 linux操作系统的目录结构 bin   #可执行程序的安装目录,命令boot #系统启动引导目录dev #设备目录,deviceetc #软件配置文件目录home #用户的家目录lib #系 ...