本文转载与 :http://blog.csdn.net/pucker/article/details/41832939

今年如约放出了新的iPhone 6与iOS 8系统,SDK针对新的设备和系统的界面适配也进行了若干改进,因此我也想借此机会跟大家分享一下我自己关于界面自动布局的理解,如有错误请不吝指教。

一、视图定位的基本原理

视图(View)是一个用于显示内容的矩形区域,它是构成app界面的最基本单元。下图为计算器app的横屏界面,其中每一个计算器按键都是一个视图。

在平面直角坐标系中,要准确描述一个矩形需要确定以下四个布局属性(Layout Attribute),即水平位置x垂直位置y宽度w高度h(暂不考虑旋转)。只有上述4个布局属性都明确的情况下,该视图才能正确添加到界面中。

以上图为例,如果要将数字键5添加到界面中,则代码类似为:

[objc] view plaincopy
  1. UIView* number5View = [[UIView alloc] initWithFrame:CGRectMake(x, y, w, h)];
  2. [parentView addSubview:number5View];

上述代码详细给出了该视图的4个布局属性的值,我们姑且称这种方式为“显式坐标定位方式”

二、旧的界面布局方式及其缺点

请思考以下问题:

  • 显式坐标定位方式在处理视图数量很多时会遇到什么问题?
  • 显式坐标定位方式在处理横竖屏旋转时会遇到什么问题?

首先,当视图数量很多的情况下,由于每个视图都需要明确给出4个属性,因此构建每一个视图非常繁琐而又容易出错。而且,当发生界面变化(例如横竖屏旋转)时,你需要重新计算每个视图的新的布局属性值。这显然不是一个令人满意的解决方法。

于是苹果给出了一个更好的解决方法,就是在创建视图的同时给出其相对于父视图的“对齐方式与缩放系数”,即autoresizingMask。当父视图发生变化时,通过每个子视图的autoresizingMask即可自动得出新的位置,而无需开发者提供。例如上图中的等号键,即可以指定其对齐方式为右对齐、下对齐,指定其缩放系数为固定宽度、固定高度。这样就保证了等号键总位于其父视图的右下角且宽高不变。

苹果解决问题的角度是正确的,通过给出界面变化的规则来自动计算出布局属性的值,从而省去开发者的工作。

然而autoresizingMask的问题在于:

  • 其描述界面变化规则不够灵活,很多变化规则根本无法精确描述。autoresizingMask缩放比例是UIKit内部计算的,开发者无法指定缩放比例的精确值。
  • 变化规则只能基于父视图与子视图之间,无法建立同级视图或者跨级视图之间的关系。例如,对于上图的计算器,autoresizingMask无法描述数字键5紧贴在数字键8下面,以及数字键0左侧与数字键1左侧对齐且数字键0右侧与数字键2右侧对齐这样的规则。

因此在过去,很多时候开发者还不得不硬着头皮使用显式坐标定位方式来解决转屏(例如重写layoutSubviews方法),或者分别做横屏与竖屏两套界面。

这些开发者都能忍,然而噩梦才刚刚开始。。。

iPhone 4s及早期的iPhone屏幕尺寸都是320*480,基本上在测试机上运行的效果就是用户运行的效果。但此后iPhone 5带来了的是16:9的宽屏,尺寸变成了320*568,另外有的app还需要同时支持iPad。难道所有这些设备都需要开发者去自己处理每个视图的精确位置,自己去处理转屏吗?

苹果也意识到了这样的问题,因此在iOS 6发布的时候引入了自动布局(Auto Layout)布局约束(Layout Constraint)的概念,来解决上面遇到的问题。

三、自动布局的原理与使用方法

自动布局是对autoresizingMask的进一步改进,它允许开发者在界面上的任意两个视图之间建立精确的线性变化规则。所谓线性变化就是数学中的一次函数,即:

y = m*x + c

其中x和y是界面中任意两个视图的某个布局属性,m为比例系数,c为常量。例如,如果我们想描述数字键5紧贴在数字键8下方,我们可以建立如下规则:

  • 数字键5的水平中心x坐标 = 1.0 * 数字键8的水平中心x坐标 + 0.0  //8和5水平中心对齐
  • 数字键5的顶部y坐标 = 1.0 * 数字键8的底部y坐标 + 0.0  //8的底部为5的顶部
  • 数字键5的宽度w = 1.0 * 数字键8的宽度w + 0.0  //8和5宽度相等
  • 数字键5的高度h = 1.0 * 数字键8的高度h + 0.0  //8和5高度相等

每个线性变化规则称之为布局约束(Layout Constraint)。由于每个视图需要确定4个布局属性才能准确定位,因此一般来说都需要建立4个布局约束。

转载于:https://www.cnblogs.com/fantasy3588/p/4970205.html

ios自动布局(1)相关推荐

  1. iOS 自动布局框架 – Masonry 详解

    来源:伯乐在线 - 刘小壮 如有好文章投稿,请点击 → 这里了解详情 如需转载,发送「转载」二字查看说明 目前iOS开发中大多数页面都已经开始使用Interface Builder的方式进行UI开发了 ...

  2. iOS自动布局框架-Masonry详解

    目前iOS开发中大多数页面都已经开始使用Interface Builder的方式进行UI开发了,但是在一些变化比较复杂的页面,还是需要通过代码来进行UI开发的.而且有很多比较老的项目,本身就还在采用纯 ...

  3. 更加优雅的iOS自动布局

    因为懒,所以之前几乎不用代码进行自动布局.但是使用xib和storyboard,总是有那么一些局限性.使用代码布局在某些时候就成了必须了?  . iOS原生的布局方式太过麻烦.要么使用VFL(Visu ...

  4. iOS自动布局-VFL格式约束

    AutoLayout  VFL可视化格式约束 一.VFL简介 iOS的自动布局约束主要有三种方式, 1.可视化界面中添加布局,比如在Storyboard xib. 2.代码添加当个约束 3.VFL格式 ...

  5. iOS自动布局之autoresizingi

    对于iOS的app开发者来说,不会像Android开发者一样为很多的屏幕尺寸来做界面适配,因此硬编码的坐标也能工作良好,但是从设计模式上来说这不是好的做法.而且也还有一些问题,如iPhone5的适配, ...

  6. ios怎么引入masonry_详解 iOS 自动布局框架 Masonry

    集成方式 Masonry支持CocoaPods,可以直接通过podfile文件进行集成,需要在CocoaPods中添加下面代码: pod 'Masonry' Masonry 学习建议 在 UI 开发中 ...

  7. iOS 自动布局和弹性盒子

    当同事问到我这个问题时,我脑子中直接冒出了一个词"弹性盒子". 问题: 有一个 Cell 中有 4 个并排排列的控件,布局如下图所示: 假设: 1.        这些控件高度和y ...

  8. 学会爱上iOS自动布局(Auto Layout)

    本文翻译自Yari Dareglia的LEARN TO LOVE AUTO LAYOUT文章 先生们,女士们,让我们以正确的心态开始本教程吧:自动布局就是简单! 我花了一段时间来掌握自动布局是如何工作 ...

  9. iOS自动布局(AutoLayout)之 NSLayoutAnchor

    自动布局(AutoLayout)之 NSLayoutAnchor 方式使用 AutoLayout 自动布局(AutoLayout)是iOS6引入的关系布局,实现动态位置和多视图关系的布局方式,是对fr ...

最新文章

  1. 本硕非科班,单模型获得亚军!
  2. 前端学习(568):元素定高 容器定高 为什么不能居中
  3. 基于.NET的分词软件设计与实现V1.0--总体思路及算法实现
  4. linux下文件删除的原理精华讲解(考试题答案系列)
  5. Linux内核分析 - 网络[十七]:NetFilter之连接跟踪
  6. jtextpane设置不能选中_你会设置数据有效性吗?
  7. 信号与信号分解理解总结
  8. 我要做 Android 之 Service
  9. 计算机网络属性设置方法,电脑本地连接的属性设置在哪里
  10. oracle 01157,Oracle数据库启动时出现ORA-01157和ORA-01110问题
  11. 笔记: 《分布式系统:概念与设计》第一章 分布式系统的特征
  12. 逆Laplace数值逆变换
  13. jsdroid 教程_2020年建筑行业资源近2000G免费建筑教程,分享给有需要的建筑同行
  14. odac oracle效率差,垃圾,奇慢 ORACLE ODAC
  15. Tera term的TTL脚本使用方法
  16. 大学c语言如何自学,大学c语言的学习方法指导
  17. 在线协同编辑器Etherpad介绍与使用
  18. jpg照片太大怎么压缩?教你简单快速完成jpg压缩
  19. 带轮轮毂长度l和带轮宽b表_A型V带轮的轮缘宽B,轮毂孔径D和轮毂长L.doc
  20. 利用python的scrapy框架爬取google搜索结果页面内容

热门文章

  1. Flex DataGrid设置不同行高度和自动换行
  2. exchange 2010 sp2 证书问题
  3. 【中文】Joomla1.7扩展介绍之Kunena(强大的论坛)
  4. winForm调用HTTP短信接口
  5. Vue+Element前端导入导出Excel
  6. oracle XE解决端口占用等问题
  7. springboot配置Druid数据源
  8. Gym - 101480K_K - Kernel Knights (DFS)
  9. [Hdu3652]B-number(数位DP)
  10. mysql-mmm故障解决一例