探索AutoLayout的本质和解决一些问题

最近频繁使用AutoLayout,记录下自己的一些发现和问题的解决(不是教程)

1.简介

Auto Layout 是苹果在 iOS 6中新引入的布局方式,旨在解决不同尺寸屏幕的适配问题。

屏幕适配工作在 iPhone 6 及 plus 发布以后变得更加重要,而且以往的“硬编程”的工作量大幅增加,所以很多人开始学习使用 Auto Layout 技术。

2.核心思想

Auto Layout 的本质是依靠 某几项约束条件 来达到对某一个元素的定位。

我们可以在某个地方只使用一个约束,以达到一个小目的,例如防止内容遮盖、防止边界溢出等。

但我的最佳实践证明,如果把页面上每一个元素的位置都用 Auto Layout 进行 “严格约束” 的话,那么 Auto Layout 可以帮我们省去非常多的计算 frame 的代码。

“严格约束” 是什么?

简单来说,严格约束就是对某一个元素的绝对定位,让它在任一屏幕尺寸下都有着唯一的位置。

这里的绝对定位不是定死的位置,而是对一个元素 完善的约束条件

让我们看图说话:

  1. 我们要在一个直角坐标系里描述一个矩形。
  2. 那么只需要指定这个矩形的位置和大小。
  3. 那么只要给出上图中的四个值即可:到左边界的距离,到上边界的距离,宽度,高度。
  4. 这四个约束是最简单的情况。在对一个元素进行严格约束时,请直接在脑中构建这个元素,并且加上几条约束条件,如果他无法缩放和动弹,那么严格约束就是成功的!
  5. 必须牢记,使用 Auto Layout 时最重要的是:对页面上每一个元素都进行严格约束,不严格的约束是万恶之源。

3.容易犯的错误

如果预览的样式和你预想的不一样,检查一下是不是忘记给作为背景的 view 添加约束(上下左右),可能有一个约束缺失,导致整体样式出错。

4.找不到原因的情况

在 ScrollView 中通过 AutoLayout 设置 StackView 子视图不固定宽度时,需要设置和 superview Equal Widths,然后根据需要调整间距。

否则子视图宽度约束设置不生效。如果出现其他 view 宽度不对劲的情况,也可以试着用 Equal Widths 解决。

如图,分别为宽度不正常情况和使用 Eauql Widths 之后正常情况:

5.一点闲话

据说Android在最新的version中也开始使用这种约束,不知道是不是真的,但是如果Android也实现了这种技术的话真的非常有用。

时间: 2024-10-12 03:29:26

探索AutoLayout的本质和解决一些问题的相关文章

Servlet 知识点 中文乱码的本质与解决

本质原因:在servlet中出现中文乱码的原因编码和解码采用的不是一个编码表或者两个编码表不是兼容 例如UTF-8编码.GBK编码都可以读取中文,那么如果采用UTF-8编码保存文件,但是采用GBK编码读取文件就会造成乱码,因此UTF-8编码保存的文件应该使用UTF-8编码读取: 除了上述的utf-8,gbk之外字符编码表,还有ANSI 编码.GB2312编码等常用的编码表. 乱问题的解决: 原文地址:https://www.cnblogs.com/cplinux/p/9738050.html

屏幕适配Autoresizing / Autolayout / Mansory / 自定义Frame实现

1. 什么是适配: 适应.兼容不同版本不同尺寸的移动智能设备 iPhone尺寸:3.5.4.0.4.7.5.5inch iPad尺寸:7.9.9.7inch,横竖屏适配 2. 点与像素 非retaina屏:1个点 = 1个像素 retain屏:1个点 = 4个像素 3. 什么是Autolayout 1>  是一种“自动布局”技术,专门用来布局UI界面的 2> 自iOS 6开始引入,由于Xcode 4的不给力,当时并没有得到很大推广 3> 自iOS 7(Xcode 5)开始,Autolay

AutoLayout

1. iOS两种自适应布局方式: -AutoLayout(自动布局) + SizeClasses(尺寸类别) -Autoresizing (自动调整尺寸/弹簧式调整尺寸) 前者 AutoLayout 是从iOS6出现,通过创建视图约束实现自适应,SizeClasses是iOS8 开始出现,用于配合AutoLayout使用,为解决所有(包括iPhone,iPad)iOS设备屏幕尺寸和屏幕旋转时UI的适配. 后者是早期开发使用的适配界面的方式,现在仍然保留.通过弹簧式调整控件尺寸,使其适应屏幕的尺寸

JDK安装后 没有tools.jar 和dt.jar包的解决办法

今天花了几个小时弄JDK,安装后发现jdk\lib中没有tools.jar 和 dt.jar包,网上搜罗了很多解决办法,都没有解决问题.最后看到一个本质的解决方法,出现这个问题的原因是在JDK安装时将JDK和JRE放在了同一目录下,导致了文件的覆盖,致使tools.jar 和 dt.jar包被覆盖. 解决方法: 我的操作系统是win7,在安装JDK过程中,第二次选择目标文件夹是选择与第一次安装目录不同的文件夹目录下即可. 例如:第一次安装目录为c:\jdk 第二次安装目录为c:\jre 安装完后

寒哥细谈之AutoLayout全解

文/南栀倾寒(简书作者)原文链接:http://www.jianshu.com/p/683fbcbfb705著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”. 看到群中好多朋友还停留在Frame布局的痛苦时代 ,以及有些开发者接手别人的就项目发现布局一团乱 . 而且没有启动图的时候并不是真正真正适配iPhone 6(S) iPhone6(S) Plus等设备 . 寒哥准备尽可能详细的讲一讲我所掌握的AutoLayout . AutoLayout很难? 我觉得AutoLayout的难的

自动布局Autoresizing与Autolayout

一.关于iPhone屏幕的一些基本常识 1.ios屏幕适配的尺寸 iPhone的尺寸3.5inch.4.0inch.4.7inch.5.5inch iPad的尺寸7.9inch.9.7inch 2.点和像素的关系 非retina屏幕之中: 1个点由1x1个像素组成 在retina屏幕之中: 1个点由2x2个像素组成(iPhone6Plus 3x3个) 二.Autoresizing 1.简介 在Autolayout之前,可做屏幕适配,但是有很大局限性.已经是比较过时的设置适配方法了,而且有很大的缺

AutoLayout PG

一.Autolayout 中的概念 1,约束Basics (1)常量值:偏移量与物理尺寸: (2)关系:>=等关系: (3)优先级(NSLayoutPriority). 自动布局不能交叉有自定义子视图frame(layout subviews)的视图层级. 自动布局不能交叉有弹跳变化(bounce transform)的视图. 2,潜在Content Size 3,应用程序的架构 Auto Layout的架构把布局的活分给controller与view. 控制器的角色有以下功能: 3.1,set

解决dns服务器未找到问题 &&DNS解析服务器

第一部分: 有时已经连接到了网络,但是却提示未找到dns服务器,或未连接dns服务器,这多是因为dns设置的问题.下面是几种可行的解决方法. 方法一: 1. win + R   -> cmd -> netsh winsock reset 来重置网络目录.   2. 重启计算机. 问题: 不会存在多余的问题. 方法二: 1. 网络设置 -> 状态 -> 网络重置. 2. 五分钟后电脑自动重启. 问题: 会重置你之前设置的网络以及保存的密码. 方法三: 1. win + R ->

探索一个NSObject对象占用多少内存?

1 下面写代码测试探索NSObject的本质 Objective-C代码,底层实现其实都是C\C++代码 #import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { // insert code here... NSObject *obj = [[NSObject alloc]init]; } return 0; } 把Objective-C代码 转换成C++代码