代码:https://github.com/xufeng79x/AutoLayout-IB

1.简介  

  Autolayout旨在解决不同高宽度的屏幕下的显示问题,通过增加给控件增加约束来达到不同屏幕间的自适应。

2.问题产生与解决方法

  Autolayout解决的控件屏幕自适应问题,如果没有这个技术那么会发生什么呢?如应用为在3.5英寸屏幕下的创建了两个view。

当运行于iphone4等3.5英寸的模拟器下时候完全正常。

                        

但是如果我们将其运行于6+的模拟器后会怎么样呢?貌似蓝色块与边缘的间隔变大了。

  

原因就在于我们传统布局的时候都使用的是据对坐标,控件的frame固守着坐标值,无论当前设备是什么尺寸,这就造成了上述现象的发生。

Autolayout可以解决这个问题,autolayout通过“约束”来限定多个view或者自身的布局关系,从而让空间摆脱固有坐标的束缚。

3.autolayout的使用---IB方式

  如上图中为了让布局能够在不同屏幕的size上都能够表现正常,我们一步一步的对其增加“约束”

  1.设定两个view与各自边缘的留白保持不变。

             

  结果,在不同屏幕尺寸下view都能够按照约束来布局:

  

  单数问题又来了,貌似两者之间的间隔被扩大了,于是我们再去:

  

  2. 约束两者的间隔保持不变。

  

  结果,发现蓝色的view与红褐色的view宽度发生不一致,原本都是设置为100的。

  

  造成这样的结果是因为,我们设定了上述约束,系统为了保持这样的约束从而将某个view进行了拉伸(如果不拉伸就无法完成约束)

  

  3.为了解决这个问题,我们在设置两个view的宽度保持一致的约束

  

  结果,两个的宽度一致,间隔约束也遵守了,但是好像高度变形了,原来都是正方形,现在变成都是长方形了。

  

  4.为了解决这个问题我们需要将两个view的长款比例做一个约束,让其保持现有的比例即1:1

  

  结果,两个view都会保持长宽1:1的比例

  

4.约束问题

  1.约束缺少问题

  通过以上约束设定后会发现还有一些约束问题,如下图点击红色按钮会显示具体约束问题:

  

  下图说明我们在横向我们已经做了足够约束,但是在纵向方向上依然没有约束:

  

  我们需要给纵向加上约束,问题解决。

  

  

  2.约束冲突

  如果我们将两个size的长和框固定住,这样势必会和横向上的约束有冲突,因为纪要保持宽度不变,又要保持边距和间隔距离是完全做不到的,相互矛盾的。

  

  结果,应用运行的时候回出现如下错误日志:

  

-- :::] Unable to simultaneously satisfy constraints.
    Probably at least one of the constraints in the following list is one you don't want.
    Try this:
        () look at each constraint and try to figure out which you don't expect;
        () find the code that added the unwanted constraint or constraints and fix it.
(
    "<NSLayoutConstraint:0x7fa070e347b0 H:[UIView:0x7fa070e342c0(100)]>",
    "<NSLayoutConstraint:0x7fa070e34dc0 H:[UIView:0x7fa070e34c00(100)]>",
    "<NSLayoutConstraint:0x7fa070e36490 H:|-(20)-[UIView:0x7fa070e342c0]   (Names: '|':UIView:0x7fa070e33f40 )>",
    "<NSLayoutConstraint:0x7fa070e36530 H:[UIView:0x7fa070e342c0]-(80)-[UIView:0x7fa070e34c00]>",
    "<NSLayoutConstraint:0x7fa070e365d0 H:[UIView:0x7fa070e34c00]-(20)-|   (Names: '|':UIView:0x7fa070e33f40 )>",
    "<NSLayoutConstraint:0x7fa070e134e0 'UIView-Encapsulated-Layout-Width' H:[UIView:0x7fa070e33f40(375)]>"
)

Will attempt to recover by breaking constraint
<NSLayoutConstraint:)]>

Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful.
-- :::] Unable to simultaneously satisfy constraints.
    Probably at least one of the constraints in the following list is one you don't want.
    Try this:
        () look at each constraint and try to figure out which you don't expect;
        () find the code that added the unwanted constraint or constraints and fix it.
(
    "<NSLayoutConstraint:0x7fa070e347b0 H:[UIView:0x7fa070e342c0(100)]>",
    "<NSLayoutConstraint:0x7fa070e36490 H:|-(20)-[UIView:0x7fa070e342c0]   (Names: '|':UIView:0x7fa070e33f40 )>",
    "<NSLayoutConstraint:0x7fa070e36530 H:[UIView:0x7fa070e342c0]-(80)-[UIView:0x7fa070e34c00]>",
    "<NSLayoutConstraint:0x7fa070e365d0 H:[UIView:0x7fa070e34c00]-(20)-|   (Names: '|':UIView:0x7fa070e33f40 )>",
    "<NSLayoutConstraint:0x7fa070e364e0 UIView:0x7fa070e34c00.width == UIView:0x7fa070e342c0.width>",
    "<NSLayoutConstraint:0x7fa070e134e0 'UIView-Encapsulated-Layout-Width' H:[UIView:0x7fa070e33f40(375)]>"
)

Will attempt to recover by breaking constraint
<NSLayoutConstraint:)]>

Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful.

  3.位置错误

  当我们为控件添加了约束,这个时候不小心改变了控件的位置,此时就会出现位置错误的提示,在界面上提示为橙色的约束线。

  如下图我们将某个view往下拖一定位置:

  

  由于往下拖动后,在Y上的约束就会被打破,此时可以点击来解决此问题:

  

  当选择Update Frames的时候控件会被回复到原来的frame位置,当选择Update Constraints时候将当前约束匹配当前的控件frame位置。

完毕,上述主要讲解了IB方式的autolayout约束方式和冲突方式。下一篇文件将以代码的方式来进行约束的设定。

[New learn]AutoLayout调查基于IB的更多相关文章

  1. [New learn]AutoLayout调查基于code

    代码https://github.com/xufeng79x/TestAutolayout-code2 0.插在前面 必须关闭view的自动缩放掩码,自动缩放掩码是autolayout出现之前系统管理 ...

  2. Ant学习---第五节:Ant_Junit介绍(基于3的版本)

    Junit3 和 Junit4 有本质上的区别 1.普通java类,代码如下: package learn.junit; public class HelloWorld { public String ...

  3. 基于SoftRoCE 了解RDMA

    RDMA是基于IB技术的内存直接传送,无需内核参与,硬件网卡搞定.IB需要HPC领域的专用硬件,ROCE则是RDMA协议在普通以太网卡的实现,RoCEv1是在MAC上的二层封装,局域网内可以,要通过路 ...

  4. 基于SpringBoot+SSM实现的Dota2资料库智能管理平台

    Dota2资料库智能管理平台的设计与实现 摘    要 当今社会,游戏产业蓬勃发展,如PC端的绝地求生.坦克世界.英雄联盟,再到移动端的王者荣耀.荒野行动的火爆.都离不开科学的游戏管理系统,游戏管理系 ...

  5. 《灰帽Python-黑客和逆向工程师的Python编程》学习记录

    ctypes是Python语言的一个外部库,提供和C语言兼容的数据类型,可以很方便的调用C DLL中的函数. 操作环境:CentOS6.5 Python版本:2.66 ctypes是强大的,强大到本书 ...

  6. MPI-Hydra Process Managerment Framework

    1. 概述2. 执行过程和控制流 官方文档地址:https://wiki.mpich.org/mpich/index.php/Hydra_Process_Management_Framework 1. ...

  7. iOS UI布局总结

    布局就是尺寸和位置的设置. 一.基本布局: 1)绝对布局:frame.layoutsubviews. 二.相对布局: autoresizing.autolayout.基于父视图.基于约束. 三.线性布 ...

  8. Abductive Commonsense Reasoning —— 溯因推理

    Abductive Commonsense Reasoning(溯因推理) 介绍 溯因推理是对不完全观察情境的最合理解释或假设的推论. 上图给出的是一个简明扼要的例子: 给定不同时间节点上的情境观测值 ...

  9. Learn Algorithms With Javascript - 基于 Js 进行算法学习

    基于 javascript 学习并实现常用的经典算法,欢迎对算法和数学感兴趣的 Js 开发者参与,一起学习共同进步. 算法实现 排序 插入排序 sort/lib/insertion-sort.js 希 ...

随机推荐

  1. [洛谷P4139]上帝与集合的正确用法

    题目大意:多次询问,每次给你$p$询问$2^{2^{2^{\dots}}}\bmod p$ 题解:扩展欧拉定理,求出$\varphi(p)$即可.因为$2^{2^{2^{\dots}}}>> ...

  2. [CQOI2012]交换棋子 网络流

    ---题面--- 题解: 一开始很快想出了一个接近正解的建图方法,但其实是错误的,不过还是骗了70分_(:зゝ∠)_ 首先我们可以观察到棋子有限,但费用多种,其实也就相当于限制了流量,找最小费用 对于 ...

  3. BZOJ4567:[SCOI2016]背单词——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=4567 Lweb 面对如山的英语单词,陷入了深深的沉思,“我怎么样才能快点学完,然后去玩三国杀呢?” ...

  4. 洛谷 P1640 [SCOI2010]连续攻击游戏 解题报告

    P1640 [SCOI2010]连续攻击游戏 题目描述 lxhgww最近迷上了一款游戏,在游戏里,他拥有很多的装备,每种装备都有2个属性,这些属性的值用[1,10000]之间的数表示.当他使用某种装备 ...

  5. Eclipse NDK 打印LOG信息(都在jni目录下操作)

    http://blog.csdn.net/u013045971/article/details/46448975 1 在.c文件中,引用头文件,定义TAG.LOG宏: #include <and ...

  6. 破解wingide编辑器

    先到官网下载最新版的wingide(我下载的是5.1.11-1),然后安装,打开,出现下面的界面时选第三个,然后输入“ENX27-HWM6G-XYVFA-165PG”,如下图所示: 接下来你软件会给你 ...

  7. [codeforces/edu5]总结(F)

    链接:http://codeforces.com/contest/616 A题: 统一成1e6长度的字符串,右对齐比较字典序. B题: 求所有行的最小值,里面最大的那个.暴力. C题: 先用dfs给每 ...

  8. sleep方法和wait方法的区别?

    sleep 是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复.调用sleep 不会释放对象锁.wait 是Object 类的方法 ...

  9. [技巧篇]09.Struts2豁然开朗的一些配置[记得要看哟]

    这里留下一个重要的信息,关于部署描述符,关于struts2的核心配置文件,关于JSON插件的属性配置介绍,还有特别重要的JSON的注解 关于struts.xml的配置,这里学到了新的知识 使用插件方式 ...

  10. 2015/8/26 Python基础(1):基本规则及赋值

    Python有如下的基本规则: #后表示注释 \n是行分隔符 \是继续上一行,将过长语句分开 :分号将两个语句连接在一行中 :冒号将代码头和体分开 代码块用缩进块的方式体现 不同缩进深度分隔不同的代码 ...