ios 约束(二)

iOS实战之从左往右自动填充布局页面 这里主要讲的就是控件宽度可变时的计算: 方法一: 这里使用一个宽度可变的Button,宽度不变的两个Label从左往右依次排布来测试。这里使用三组组合,每一组都用一个UIView包裹。 首先为了测试,Button的标题,依次为: NSArray *btnTitle = @[@"我是一个长标题,很长很长很长很长的标题",@"我是短标题",@"标题"]; titleLB的文本: t... 阅读详情

1、约束系统的运作规律

    可以认为约束系统所用的数学算是非常严格,实际上它们只是个参考。iOS会找到对符合约束的一种布局方案,有的时候,这种方案不止一套。下面给出约束系统的一些基本特征:

    1、约束规则描述的是关系,而不一定是视图在某个方向上的属性。未必非要在知道右边界的情况下才能算出左边界。

    2、每条约束规则都有其优先级。优先级的取值范围是从0到1000.Auto Layout系统用优先级来排列各条约束的顺序。他总是先设法满足优先级较高的约束规则,然后再去满足优先级较低的规则。优先级为99的规则总是排在优先级为100的规则后面。在排布视图位置的时候,系统会遍历开发者所添加的全部影响力。假如刚才说的那两条约束规则互相冲突,那么系统会考虑优先级为100 的那条规则,而放弃优先级为99的那条。

    优先级最高的约束规则是必须要满足,它的类型是UILayoutPriorityRequired,其值为1000,而这种类型也是系统默认的约束类型。优先级为1000的约束必须完全满足才行,比方说,我们可以表达出”此按钮必须是这种尺寸“等意图。假如某条约束规则的优先级不是1000,那么它在整个布局系统里的影响力就变弱了。

    但即便是必须满足的约束,也有可能在发生冲突的情况下遭到覆盖。如果我们没有权衡好各条规则之间的关系,那么很有可能令本来应该是100 * 100 的视图变成102 * 107.


    3、除了优先级这一因素之外,各条约束规则之间并没有其他自然的顺序。系统会同时考虑优先级相同的一系列约束。如果想令某条约束占先,那么可以提升其优先级。

    4、有些约束规则只需大致满足即可。我们可以用一些可选的约束规则来试着优化一下布局效果。比方说,”2号视图的定边应该和1号视图的底边处在同一位置“。约束系统会试着令两个视图靠近,并尽量缩小其距离。假如有其他约束规则使得这两个视图无法紧贴,那么系统会尽可能的令它们靠拢,以缩小这两个属性之间的差距。

    5、约束规则之间可以有循环。所涉及的控件只要都满足规则就行了,并不需要明确每个视图具体对应于规则中的哪个物件。不要跟交叉引用较劲。这套声明式的系统可以接受循环引用,所以开发者无需担心无限循环问题。

    6、可以用动画来表现约束规则的变化过程。从一套约束规则切换到另一套的时候,可以用UIView的动画功能来表现这个过程。在动画块中,我们可以改变约束规则之后调用layoutIfNeeded,这样的话,视图就会以动画效果来展现由上一套约束规则切换到新规则的过程。

    7、在约束规则里可以引用同一体系里的其他视图。对于某个视图来说,可以令其中一个子视图的中心点与另外一个完全不同的视图的中心点相对齐,只要两者之间有公共的祖先视图即可。比方说,我们创建了一种复杂的文本输入视图,其中还嵌套有UIImageView控件,那么现在可以令它最右侧那个按钮的right属性与按钮下方UIImageView控件的right属性相对齐。

    8、约束规则不应该跨越边界系统。在指定对齐方式的时候,不要跨越UIScrollView、UICollectionView及UITableView的边界。如果某种视图有它自己的边界系统,那么就不要从一个边界系统跳到另一个完全不同的边界系统里面去。虽说这么做可能不会使程序崩溃,但毕竟不是个好办法,而且Auto Layout对这种做法的支持度也不好。

    9、Auto Layout与transform之间可能配合的不够好。同时使用transform及Auto Layout 时要多加小心,尤其在涉及旋转的情况下更是如此。

    10、Auto Layout不能和运动效果一起工作。由UIMotionEffect实例所产生的视觉变化只会影响视图的CALayer,而不会干扰底层的布局。

    11、约束规则在运行期可能会出错。如果系统无法解析开发者所设定的约束规则,或是规则之间有冲突,那么运行期系统就会丢弃一些规则,以便尽量吧视图排布出来。这种做法很不优雅,而且经常会产生于程序需求不符的布局。Auto Layout会把详尽的信息发送到Xcode控制台,告诉开发者哪里出了错,我们可以根据这些错误报告来修正约束规则,使各条规则之间和谐一致。

    12、格式错误的约束可能会阻断应用程序的执行。规则之间若有了冲突,则只会产生错误信息,而应用程序还是可以运行的,但是,如果规则的格式写错了,那么执行了某些调用之后,程序就会因为未处理的异常而崩溃。

    13、每条约束规则必须至少引用一个视图。如果创建了一条没有引用任何视图的约束规则,那么Xcode在编译代码时不会产生警告,但程序却会在运行的时候抛出异常。

    14、避免无效的属性搭配。把某个视图的左边界和另一个视图的高度相匹配是不合法的。无效的属性组合会令程序在运行的时候抛出异常。尤其不应该吧尺寸有关的属性和与边界有关的属性混起来用。一般来说,我们都能够把有问题的属性组合检查出来,因为那些属性搭配在一起是没有意义的。

2、约束规则与框架属性

    Auto Layout的强大之处基本上在于:它排布UI的同时,还可以处理内容多变的视图。UIView有两个属性,分别是固有内容的尺寸以及对齐矩形,该矩形的范围可以超越传统的框架,以便使Auto Layout系统能够适当的处理视图之间的关系。

    1、固有内容的尺寸

    在Auto Layout系统中,视图的内容与视图的约束规则一样,都对布局起着重要的作用。内容是通过每个视图的intrinsicContentSize属性表达出来的。该方法描述了在既不挤压也不裁切的前提下完全容纳视图内所需的最小空间,其含义可以根据每个视图所要表示内容而推断出来。

    例如,对于UIImageView来说,这就相当于其中的图像所具备的尺寸。图像如果比较大,那么intrinsicContentSize也会大一些。而对于标签控件来说,则取决于字体和文本量。标签控件的intrinsicContentSize会随着文本长短与所选字体而变化。

    有了intrinsicContentSize之后,Auto Layout系统就可以把视图的框架属性也其内容较好的匹配起来。我们通常需要在每个轴上设置两种属性才能避免约束规则过少或排版方式有歧义等情况。为视图指定了intrinsicContentSize之后,就相当于已经有了其中一个属性。现在我们可以把某个基于文本的控件或UIImageView控件放在上级视图的中心,这样的排版方案只有一种,所以不会产生歧义。把intrinsicContentSize与location结合起来,就可以完整的确定视图的排布方式了。实际上,Auto Layout系统在排版时会把intrinsicContentSize  解析成一条约束规则。

    改变视图的内容之后,我们可以调用invalidateIntrinsicContentSize方法,以此告知Auto Layout系统下次排版时应重新计算intrinsicContentSize。

    Compression Resistance与Content Hugging

    Auto Layout系统在判定intrinsicContentSize的大小时会受到两个属性的影响。正如其名称所示,Compression Resistance(抗挤压性)表示视图保护其内容不受压缩的能力。抗挤压性越高的视图,越不容易收缩。他要竭力避免内容遭到裁剪。而Content Hugging(内容凝聚度)则表示一种优先级,他指明视图是否不愿意在其核心内容之外添加边距,或视图是否不愿意拉伸其核心内容(比方说,contentMode属性设为“缩放”的UIImageView控件是否不愿意拉伸其图像)。开发者可以通过setContentCompressionResistancePriority:forAxis:及setContentHuggingPriority:forAxis:方法按坐标轴来设置视图的这两种优先级。

    2、对齐矩形

    约束系统所采用的布局办法与手动排版时所用的框架不同。框架描述的视图摆放的位置及视图的大小,而约束系统的排布视图时,则使用一个与之相关的几何概念,即对齐矩形。

    在创建复杂的视图时,开发者可能会引入一些视觉上的装饰效果,例如阴影、边缘高亮、镜像以及雕刻线条等。这些特性通常是以子视图或子层的形式添加到视图里的。在添加这些物件的过程中,视图的框架及其完整范围也会随之不断变大。

    与frame不同,视图的对去矩形仅仅局限于核心视觉原件。把新的物件添加到主视图并不会影响他的大小。这个示意图带有阴影效果和徽章图样,阴影效果位于主视图的后方,而徽章则在视图右上角。排布这个视图的时候,Auto Layout只会把核心原件同其他视图相对齐。


    把这个对去的矩形和示意图里的那个举行比较一下。那个矩形把所有视觉装饰物都包含在内了,于是,它超出了Auto Layout系统在对齐这个视图时所应参考的边界。那个矩形把视图的所有视觉原件都涵盖进来了。假如按照此矩形来排版,那么这些装饰物可能会干扰排列视图位置时所参照的一些特征。

    Auto Layout系统是根据对齐矩形来排布视图位置的,而不是根据框架属性,这样可以确保排版时所参照的关键信息准确无误。

    声明对去矩形

    在构建带有装饰物的视图时,开发者应该把详细的几何特征告诉Auto Layout系统。如果自己的视图使用了阴影或镜像效果等装饰物,那么可以在视图类里实现alignmentRectForFrame:方法,并返回精确的对齐矩形。

    该方法接受一个参数,也就是框架。该参数表示视图所居的目标框架。示意图中的矩形。那个矩形所代表的框架就涵盖了这个视图,这其中也包括附着在视图上的装饰物。开发者应该根据那个目标框架以及视图中所嵌入的原件来计算出精确的对齐矩形。

    此方法所返回的CGRect值指明了视图的核心视觉内容所处的那个矩形,它通过就是主视图对象本身的框架,而不包括作为子视图或CALayer的子层添加到视图中的那些装饰物。

    如果要对视图执行坐标变换,那么请记住一并实现frameForAlignmentRect:方法。该方法描述的是反向关系,也就是根据传入的对齐矩形来算出可以完整包含所有装饰物的框架。我们会以传入的那个对齐矩形为基础扩大其边界,使之能够把视图里的所有装饰物都涵盖进来。

iOS自动布局高级用法及纯手码约束写法 立即下载

相关推荐

拜耳阵列(Bayer Pattern)以及常见彩色滤波矩阵(CFA)

本文介绍了拜耳阵列的工作原理(Bayer Pattern)以及常用的彩色滤波矩阵(CFA)

风一样的男子(quinta)的博客 7120

ios 约束(一)

1、什么是约束     约束就是一系列描述iOS程序视图布局的规则。他们限定了视图之间的关系,也限定了视图的布局形式。使用约束时。我们可以说“这些视图在水平方向上必须对齐”,或是“此视图必须根据另一个视图来调整自身高度,以便与之相符”。约束向开发者提供了一套布局语言,使得可以向视图里添加约束,并以此来描述各视图的空间关系。     iOS负责通过一套约束满足系统来实现这些布局需

ChasingDreamsCoder的博客 1136

esp32c6 开发实战:低功耗蓝牙(BLE)开发

蓝牙栈在此程序流程中已经启动并运行,但是应用程序的功能尚未定义。功能的定义是通过响应事件来实现的,当其他设备尝试读取或写入参数以及建立连接时就会触发事件回调函数处理。BT控制器在控制器端实现主机控制器接口(HCI),链路层(LL)和物理层(PHY)。BT控制器对用户应用程序不可见,并处理BLE堆栈的较低层。蓝牙堆栈(Bluedroid stack)定义了经典蓝牙(BT Classic)和低功耗蓝牙(BLE)的通用定义和API。的判断)等对于启动低功耗蓝牙来说不重要的代码,函数初始化和启用BT控制器。

月入鱼饵的博客 2740

iOS Auto Layout原理与约束系统深度解析(10)

在iOS开发早期,开发者主要使用`frame`属性进行视图布局,这种方式在多设备适配场景下存在诸多弊端。随着iPhone屏幕尺寸增多、iPad设备引入,基于`frame`的布局方式难以适应动态变化的屏幕环境。为此,苹果在iOS 6引入Auto Layout,通过约束系统实现视图间关系的声明式布局,解决多设备适配难题。

Android开发领域创作者 1881

Unity开发微信小游戏,使用Addressables管理游戏资源(本地进行远程测试)

快速构建Unity微信小游戏 使用Addressables管理游戏资源 使用小皮助手在本地进行远程资源加载测试

the_vnas的博客 6390

6-3 根据派生类写出基类(Java解法)(PTA)

主要是看main函数里调用了什么方法和输出样例,一一对应一下有思路再写就很简单.建议使用IDEA自动生成,可以少写很多代码。

u012137663的博客 1141

【iOS】Masonry的基本使用

暑假安装了cocoapods,简单使用其调用了SVGKit,但是没有学习Masonry,特此总结博客记录Masonry的学习于此基础的Masonry的使用已经基本讲解完了,后续在写计算器的时候会更多的使用到Masonry,一些更深层次的用法会在后面的博客中讲解另外需要记住的一点是使用Masonry会影响我们的性能,frame往往是最简单高效的,在实际的设计中我们可以将这两种布局方式进行混合使用。

weixin_72437555的博客 4883

安路科技FPSoC开发实战:从芯片特性到边缘计算应用

本文深入解析安路科技FPSoC芯片在边缘计算领域的开发实战,重点介绍SALDRAGON系列芯片的异构计算架构优势,包括RISC-V/ARM处理器与FPGA的协同工作。通过工业控制和智能视觉应用案例,展示硬件加速实现与低功耗设计技巧,帮助开发者高效利用FPSoC进行边缘计算应用开发。

weixin_29248611的博客 375

IOS 添加自动布局约束NSLayoutConstraint

自定义UICollectionViewCell,并添加自动布局约束。

路人甲 881

AC7811无感FOC实战:从开环到闭环的电机控制调试全记录

本文详细记录了基于国产AC7811芯片实现无感FOC电机控制的全过程。从硬件软件环境搭建、开环I/F启动调试,到滑模观测器参数整定,再到平滑切入闭环及双环PID调节,提供了完整的实战步骤与参数调试心法。文章重点分享了无感控制从开环到闭环切换的关键技巧与常见问题排查清单,为工程师提供了一份避坑指南。

kotlin6android的博客 713

UEFI开发探索102 – ACPI探究01(UEFI配置表)

(请保留-> 作者: 罗冰 https://blog.youkuaiyun.com/luobing4365) ACPI探究01(UEFI配置表)1 大致规划2 UEFI Configuration Table(配置表)3 代码实现 最近有项工作,是修改ACPI表。问题本身并不复杂,但是由于代码需要移植到Option ROM上,遇到不少奇怪的现象。因此,花了不少时间,对ACPI进行研究。 任务是完成了,我的好奇心又被勾起来了。准备发挥“格物致知”的信念,把我认为的ACPI各方面的知识,好好地捋一捋。 1 大

8244

IOS开发之约束(屏幕适配)

autoresizing(不建议使用) 参考父容器来设置子控件,不能参考兄弟容器,被淘汰 设置 小技巧:点击Preview,并双击屏幕,能显示各种设备的适配情况 代码实现 autoresizingMask的枚举属性,注意属性是相反的 typedef NS_OPTIONS(NSUInteger, UIViewAutoresizing) { UIViewAutoresizingNone = 0, UIViewAutoresizingFle

weixin_46926959的博客 737

【YOLOv11改进- 主干网络】YOLOv11+WTConv(ECCV2024): 基于YOLOv11的主干网络改进,大感受野的小波卷积

论文提出了WTConv,这是一个使用级联小波分解的层,并执行一组小卷积核的卷积,每个卷积专注于输入的不同频率带,并具有越来越大的感受野。这个过程能够在输入中对低频信息给予更多重视,同时仅增加少量可训练参数。实际上,对于一个  的感受野,可训练参数数量只随着  的增长而呈对数增长。而WTConv与常规方法的参数平方增长形成对比,能够获得有效的卷积神经网络(CNN),其有效感受野(ERF)大小前所未有。

qq_41304809的博客 1401

IOS布局笔记二( Visual Format Language 定义水平和垂直约束)

定义限制条件来改变一个 UI 组件在其父视图的水平和垂直方向布局的方法。 可以使用方程式里 H:方向符号代表水平方向的边距,使用 V:方向符号代表垂直方向的边 距。 1.改变按钮在屏幕上的边距   使用 visual Format Language 在水平方向的限制条件使用的三个例子 要编写的例子的约束条件如下: ·邮件区域离视图的顶部具有一个标准的垂直方向

Lves Li的专栏 2708

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

iOS-原生纯代码约束总结(二)之 AutoLayout

一,概述 AutoLayout相比AutoResizing更加实用,是可以完全替代AutoResizing的一种自动布局方式。而在使用AutoLayout前,我们必须理解一个属性,那就是translatesAutoresizingMaskIntoConstraints。该属性表示autoresizingMask和autolayout两种方式的转换。这个属性对于在代码中生成的vie...

weixin_34284188的博客 780

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

iOS使用约束实现动画效果

我知道的方法有两种: 1.在改变完约束后,在动画块内,使用方法layoutIfNeeded,可以实现一般普通的动画效果。 2.使用Facebook的pop框架,给约束加动画,详情见:http://www.jianshu.com/p/1172578c96e1。

中国架构师的博客 8万+

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

使用masonry 添加约束,调用 layoutIfNeeded 之后仍然无法获取到frame(二)

如图,发现这样layouifneed之后是获取不到控件的frame 的 (在添加约束之前调用了layoutIfneed) 正确的方式 方案一: 去掉在懒加载中的layoutifneed 只保留在添加约束之后的layoutifneed , 方案二: d

liubo的博客 1083

ios 旋转屏幕试图切换_ios 屏幕旋转适配(横屏适配)

屏幕的横竖屏适配有很多种,今天写直播demo的时候发现给播放器一套约束或者frame,自动切换横屏的时候布局混乱拉伸。这第一种方法,直接监听横竖屏切换,然后改变布局代码,纯代码布局基本都是这个思路。/** 注册屏幕横竖通知 *///开启和监听 设备旋转的通知(不开启的话,设备方向一直是UIInterfaceOrientationUnknown)if (![UIDevice currentDevic...

weixin_29432421的博客 809

iOS-用两个button等分屏幕宽度的两种实现方式

iOS-用两个button等分屏幕宽度的两种实现方式 1、单独做计算 可以先将按钮的宽度相加,然后(屏幕宽度-按钮相加宽度)/3 得到间隙的大小,然后再将按钮按照计算结果进行计算放置即可。这里需要固定按钮的宽度,才能实现。这里有个精度损失问题,因为在Int和Float之间转换有损失。关键代码如下: let interval = (screenWidth - CGFloat(forgetButtonWidth) - CGFloat(loginButtonWidth) )...

az44yao的专栏 622

不明原因的约束报错的两种处理方式

不明原因的约束报错的两种处理方式 原文 相信大家在iOS的开发中,经常会遇到一些不明原因的约束警告,有时候按百度到的方法试一下就好了,有时候却不行.而且下一次可能还会出现,比如下面这种约束的报错 Unable to simultaneously satisfy constraints. Probably at least one of the constraints in the followi...

weixin_34416754的博客 667

FLKAutoLayout性能优化:提升iOS应用布局效率的3个关键点

FLKAutoLayout是一个功能强大的UIView分类库,它让开发者能够轻松地在代码中创建iOS应用的布局约束。对于追求流畅用户体验的iOS应用来说,布局性能至关重要。本文将分享三个提升FLKAutoLayout性能的关键技巧,帮助你打造响应更快的iOS应用。 ## 1. 优化约束创建:减少不必要的计算开销 FLKAutoLayout提供了多种便捷的约束创建方法,但不当使用可能导致性能问题

gitblog_00910的博客 603

iOS 给 Storyboard 创建的 view 添加动画效果

使用 storyboard, xib 创建的视图, 视图的约束是用的 Autolayout , 所以实现动画效果也要通过改变约束的值,而不是直接改变 frame 示例: 在控制器上添加一个 blueView, blueView 上添加一个 greenView, 现改变 blueView 的宽度实现动画效果 一. 改变约束值实现动画 将 blueView 的宽度拉成属性 Blu...

Lee优快云77的博客 992

ios实现navigationItem的titleLabel双行显示

要实现上面这个功能其实有很多方法,我这里介绍两种方法来实现,一种是通过我们创建一个view,然后往这个view里面加入两个label,然后我们再设置自动布局的约束 //设置titleView let titleView = UIView(frame: CGRect(x: 0, y: 0, width: 200, height: 32)) /

rv0p111 2038

ios 中autolayout multipli属性的设置

方法一:用三方的框架masonry            [self.loginBtn mas_makeConstraints:^(MASConstraintMaker *make) {                 make.width.equalTo(self.view.mas_width).multipliedBy(0.3);         make.height.equa

wangqiuwei07的专栏 467

小红书iOS校招笔试题全解析:底层原理与高频考点复盘

iOS开发岗位的校招笔试,往往不局限于API调用,而是深入考察语言特性与运行时机制。从Objective-C的消息发送、Swift的值类型与引用类型,到底层内存管理、多线程并发控制,每一类考点都要求开发者理解设计原理而非机械记忆。在实际工程中,这些知识点直接关系到App的稳定性、性能与安全性,比如循环引用的排查、离屏渲染优化、线程死锁规避等。无论是准备面试,还是系统性补强iOS基础,掌握这些核心机制都能显著提升技术判断力。本文以小红书2020年iOS方向笔试题卷二为样本,按模块拆解高频考点与易错细节,帮助开

weixin_34161083的博客 348

iOS 基础 - 约束布局

xib 设置 代码 设置 三方框架

LOLITA0164的博客 1万+
上一篇: ios 约束(一)
下一篇: ios 约束(三)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值