约束布局(ConstraintLayout)
概述:加快开发速率,减少UI嵌套,提高UI绘制速度
一、尺寸约束
三种:wrap_content,Fixed,match_constraint
1)wrap_content:依据内容大小决定宽高
2)Fixed:制定控件宽高
3)match_constraint:控件大小依赖于他的依赖控件的位置
4) layout_constraintDimensionRatio="H,2:3": 高:宽=2:3(可以通过宽/高中的一方为0,进行宽高比例设置)
5) goneMargin(隐藏边距):当约束目标的可见性为View.GONE时,还可以通过以下属性设置不同的边距值:
6) Gone:隐藏掉的控件, 会被解析成一个点,并忽略margin
二、位置约束
1)layout_constraintHorizontal_bias:水平方向上两边偏移比例
2)layout_constraintVertical_bias:垂直方向上两边偏移比例
三、角度约束
使用角度以及半径约束两个控件中心的距离
1)layout_constraintCircle:设置约束对象
2)layout_constraintCircleAngle:设置约束角度
3)layout_constraintCircleRadius:约束半径
四、链式约束
在水平与垂直方向对控件的位置做约束
1)链头:水平约束的左边第一个/垂直约束的上面第一个
2)三种方式:通过链头进行设置
1、packed:链中控件打包到一起
2、spread:默认,可以通过偏移比例进行位置约束
3、spread_insert:展开元素,但链的两端贴近parent
五、辅助工具
1)Optimizer: layout_optimizationLevel(还没找到相关使用说明)
none:不优化
standard:默认,仅优化直接和障碍约束
direct:优化直接约束
barrier:优化障碍约束
chain:优化链条约束
dimensions: 优化维度测量,减少匹配约束元素的度量数量
2)Barrier:可以在多个控件的一侧建立一个屏障
3)Group:可以把多个控件归为一组,方便隐藏或显示一组控件
4)Placeholder:指的是占位符。在Placeholder中可使用setContent()设置另一个控件的id
5)Guildline:像辅助线一样,在预览的时候帮助你完成布局(不会显示在界面上)
传送门: 约束布局ConstraintLayout看这一篇就够了
1、首先为链条的布局创建一个草图。
2、点击【 样条曲线工具】,点击套合样条曲线并选择所有草图元素从而创建出连续曲线。
3、建立链条单元模型。在创建链条单元的第二个实体模型时取消勾选“合并结果”从而将它们保留为两个单独的实体。
4、依次对两个实体模型进行镜像从而完成链条单元的创建。 注意在镜像链条单元的第二个实体模型时取消勾选“合并实体”。
5、使用两个曲线驱动的阵列完成整个模型的创建。
第二步 选择UGNX5.0拉伸命令出现拉伸对话框,选择草绘面为拉伸界面,输入拉伸距离点击确定。选择插入---关联复制---镜像体命令,出现镜像体对话框,选择平面创建平面。选择保存命令保存我们创建的零件,选择文件新建命令出现文件新建对话框,输入文件名称点击确定,选择草图命令出现创建草图对话框,选择草绘命令点击确定,选择圆命令绘制圆,选择圆角命令创建圆角,选择草绘命令在创建的零件上绘制圆,选择拉伸命令对其进行拉伸。
第三步 选择UGNX5.0保存文件。选择文件新建命令出现文件新建对话框,输入文件名称点击确定,选择草绘命令出现创建草图对话框,选择草绘面点击确定,选择圆命令绘制圆,选择标注命令对草图进行标注,选择直线命令绘制直线,选择约束命令对草图进行约束,选择拉伸命令选择草绘截面创建拉伸特征。保存文件
创建单节链节的零件模型
生成链条装配体,在装配体中创建平面草图代表链条环绕路径
装配体中使用链阵列,选中草图作为链条路径,选中单链节零件作为阵列对象,输入对应的节距等参数,完成。
参考: ConstraintLayout官方文档
目前可以使用各种类型的约束:
1.相对定位
2.边缘
3.定心定位
4.圆形定位
5.可见性行为
6.尺寸限制
7.链
8.虚拟助手对象
9.优化器
注意,约束中不能具有循环依赖关系。
相对定位是在约束布局中创建布局的基本构建块之一。这些约束允许您将给定的小部件相对于另一个小部件定位。可以在水平和垂直轴上约束小部件:
1.水平轴:左、右、起点和终点
2.垂直轴:顶部、底部和文本基线
一般的概念是将控件的给定边约束到任何其他窗口小部件的另一边。
例如,为了将按钮B定位到按钮A的右边:
这告诉系统,我们希望按钮B的左侧被约束到按钮A的右侧。这样的位置约束意味着系统将试图使双方共享相同的位置。
以下是可用约束的列表:
他们都引用了id对于另一个小部件,或父母(它将引用父容器,即约束布局):
如果设置了边距,则它们将应用于相应的约束(如果存在),将边距强制为目标和源边之间的空间。 通常的布局边距属性可用于此效果:
当位置约束目标的可见性为View.GONE时,您还可以使用以下属性指示要使用的不同边距值:
ConstraintLayout是如何处理“不可能”的约束。例如,如果我们有这样的事情:
除非ConstraintLayout恰好具有与Button完全相同的大小,否则两个约束不能同时满足(双方都不能成为我们希望它们的位置)。
在这种情况下发生的事情是,约束的作用就像是相反的力量将小部件拉平这样小部件最终将在父容器中居中。 这同样适用于垂直约束。
遇到这种相反的约束时的默认设置是使窗口小部件居中但是您可以使用偏差属性调整定位以支持一侧而不是另一侧:
例如,以下将使左侧具有30%的偏差而不是默认的50%,使得左侧将更短,小部件更倾向于左侧:
使用偏差,您可以制作更好地适应屏幕尺寸变化的用户界面。
你可以以角度和距离约束窗口小部件中心相对于另一个窗口小部件中心。 这允许你将小部件放在圆上。 可以使用以下属性:
像往常一样,GONE小部件不会显示,也不是布局本身的一部分(即如果标记为GONE,它们的实际尺寸将不会更改)。
对于布局传递,它们的尺寸将被视为零(基本上,它们将被解析为一个点)
如果他们对其他小部件有限制,他们仍然会受到尊重,但任何边距都会好像等于零
这种特定的行为允许构建布局,你可以临时标记小部件。GONE,不破坏布局,这在做简单布局动画时特别有用。
约束布局的最小尺寸
你可以为ConstraintLayout本身定义最大和最小大小:
当其尺寸设置为WRAP_CONTENT时,ConstraintLayout将使用这些最小和最大尺寸。
可以通过以3种不同的方式设置android:layout_width和android:layout_height属性来指定控件的大小:
1.使用特定值
2.使用WRAP_CONTENT,它将要求小部件计算其自身大小。
3.使用0dp,相当于“MATCH_CONSTRAINT”
前两个以与其他布局类似的方式工作。 最后一个将以匹配所设置的约束的方式调整窗口小部件的大小((a)是wrap_content,(b)是0dp)。 如果设置了边距,则在计算中将考虑它们((c)中的0dp)。
如果维度设置为WRAP_CONTENT,则在1.1之前的版本中,它们将被视为文字维度 - 这意味着约束不会限制生成的维度。 虽然通常这足够(并且更快),但在某些情况下,您可能希望使用WRAP_CONTENT,但仍然强制执行约束以限制结果维度。 在这种情况下,您可以添加一个相应的属性:
当维度设置为MATCH_CONSTRAINT时,默认行为是使结果大小占用所有可用空间。 还有几个额外的修饰符:
layout_constraintWidth_min和layout_constraintHeight_min:将设置此维度的最小大小
layout_constraintWidth_max和layout_constraintHeight_max:将设置此维度的最大大小
layout_constraintWidth_percent和layout_constraintHeight_percent:将此维度的大小设置为父级的百分比
为min和max指示的值可以是Dp中的维度,也可以是“wrap”,它将使用与WRAP_CONTENT相同的值。
要使用百分比,您需要设置以下内容:
1.尺寸应设置为MATCH_CONSTRAINT(0dp)
2.默认值应设置为app app:layout_constraintWidth_default =“percent”或app:layout_constraintHeight_default =“percent”
3.然后将layout_constraintWidth_percent或layout_constraintHeight_percent属性设置为0到1之间的值
您还可以将窗口小部件的一个维度定义为另一个维度的比率。 为此,您需要将至少一个约束维度设置为0dp(即MATCH_CONSTRAINT),并将属性layout_constraintDimensionRatio设置为给定比率。 例如:
将按钮的高度设置为与其宽度相同。
该比率可表示为:
浮点值,表示宽度和高度之间的比率
“宽度:高度”形式的比率
如果两个尺寸都设置为MATCH_CONSTRAINT(0dp),您也可以使用比率。 在这种情况下,系统设置满足所有约束的最大尺寸并保持指定的纵横比。 要根据另一个的尺寸约束一个特定边,可以预先附加W,“或H,分别约束宽度或高度。例如,如果一个维度受两个目标约束(例如,宽度为0dp并且以父对象为中心) 你可以通过在比率前添加字母W(用于约束宽度)或H(用于约束高度)来指示哪一边应该被约束,用逗号分隔:
将按照16:9的比例设置按钮的高度,而按钮的宽度将匹配父项的约束
链在单轴(水平或垂直)上提供类似组的行为。另一个轴可以独立地约束。
一组小部件被认为是一个链,如果它们通过双向连接被连接在一起(参见图,显示最小链,带有两个小部件)。
链由链的第一个元素(链的“头”)所设定的属性控制:
头部是水平链最左边的小部件,也是垂直链最顶端的小部件。
如果在连接上指定了边距,则会考虑它们。 在扩散链的情况下,将从分配的空间中扣除边距。
在链的第一个元素上设置属性layout_constraintHorizontal_chainStyle或layout_constraintVertical_chainStyle时,链的行为将根据指定的样式更改(默认为CHAIN_SPREAD)。
1.CHAIN_SPREAD - 元素将展开(默认样式)
加权链 - 在CHAIN_SPREAD模式下,如果某些小部件设置为2.MATCH_CONSTRAINT,它们将拆分可用空间
3.CHAIN_SPREAD_INSIDE - 类似,但链的端点不会分散
4.CHAIN_PACKED - 链的元素将被打包在一起。 然后,子项的水平或垂直偏差属性将影响打包元素的定位
链的默认行为是在可用空间中平均分布元素。如果一个或多个元素使用MATCH_CONSTRAINT,它们将使用可用的空白空间(在它们之间平均分配)。 layout_constraintHorizontal_weight和layout_constraintVertical_weight属性将控制如何使用MATCH_CONSTRAINT在元素之间分配空间。例如,在使用MATCH_CONSTRAINT的包含两个元素的链上,第一个元素使用权重2,第二个元素使用权重1,第一个元素占用的空间将是第二个元素占用的空间的两倍。
在链中的元素上使用边距时,边距是相加的。
例如,在水平链上,如果一个元素定义了10dp的右边距,而下一个元素定义了5dp的左边距,则这两个元素之间产生的边距为15dp。
在计算链用于定位项目的剩余空间时,会同时考虑项目及其边距。剩余空间不包含边距。
除了前面详述的内在功能之外,您还可以使用ConstraintLayout中的特殊帮助程序对象来帮助您进行布局。 目前,Guideline对象允许您创建相对于ConstraintLayout容器定位的水平和垂直指南。 然后可以通过将小部件限制为这样的指导来定位小部件。
在1.1中我们公开了约束优化器。 您可以通过将标记app:layout_optimizationLevel添加到ConstraintLayout元素来决定应用哪些优化。
none:不应用任何优化
standard :默认。 仅优化直接和屏障约束
direct:优化直接约束
barrier:优化障碍限制
chain:优化链约束(实验)
dimensions:优化维度度量(实验),减少匹配约束元素的度量数量
零件:内链节,单独做成prt格式。外链节,两片外链节装配好后(就是两个片平行,中间把内链节的位置空出来),单独做成prt格式。
装配体:空间中处于同一基准面的链轮,两个或者多个,确定好约束,并且每个轮都可独立运动
第一步:新建装配体,选择一个基准面,创建草图,画一个圆,尺寸与分度圆相同,注意这个圆是你链条轨迹的基础,推荐定位在原点。保存备用
第二步:打开链轮装配体,插入链条轨迹装配体,显示你刚才画的分度圆草图,约束这个分度圆,与主动链轮重合。然后点击修改草图(在装配体内),画出所有链轮的分度圆,并用线段连接修建成一条闭合曲线。退出
第三步:打开链条装配体,插入内外链节,取消固定,使内外链节浮动,找命令,链零件阵列,然后设置一下。
第四部,回到链轮装配体,约束链条与链轮,结束
怎么约束你自己思考,这样才能真明白
ConstraintLayout (约束布局) 继承于ViewGroup 允许开发者以灵活的方式定位和调整小部件的大小
ConstraintLayout 可让开发者使用扁平视图层次结构(无嵌套视图组)创建复杂的大型布局。它与 RelativeLayout 相似,其中所有的视图均根据同级视图与父布局之间的关系进行布局,但其灵活性要高于 RelativeLayout ,并且更易于与 Android Studio 的布局编辑器配合使用。我理解为ConstraintLayout是一个更加灵活且减少嵌套的 RelativeLayout 的布局
ConstraintLayout作为支持库提供,开发者可以在从 API 级别 9 (Gingerbread) 开始的 Android 系统上使用。
相信在面对一些复杂的UI页面,咱们都是使用 RelativeLayout , LinearLayout 层层嵌套实现的.虽然能实现效果.但是层层嵌套层层解析加载View 无疑会耗费加载时间,耗费手机性能.这是时候ConstraintLayout(约束布局),就应运而生了,它出现的目的就是减少嵌套,优化层层嵌套状况带来的弊端
要在 ConstraintLayout 中定义某个视图的位置, 您必须为该视图添加至少一个水平约束条件和一个垂直约束条件 。每个约束条件均表示与其他视图、父布局或隐形引导线之间连接或对齐方式。每个约束条件均定义了视图在竖轴或者横轴上的位置;因此每个视图在每个轴上都必须至少有一个约束条件,但通常情况下会需要更多约束条件。
当您将视图拖放到布局编辑器中时,即使没有任何约束条件,它也会停留在您放置的位置。不过,这只是为了便于修改;当您在设备上运行布局时,如果视图没有任何约束条件,则会在位置 [0,0](左上角)处进行绘制。
在图 1 中,布局在编辑器中看起来很完美,但视图 C 上却没有垂直约束条件。在设备上绘制此布局时,虽然视图 C 与视图 A 的左右边缘水平对齐,但由于没有垂直约束条件,它会显示在屏幕顶部
请注意,约束中不能有循环依赖。
相对定位是在 ConstraintLayout 中创建布局的基本构建块之一。这些约束允许您相对于另一个小部件定位给定的小部件。您可以在水平和垂直轴上约束一个小部件:
如下图,这告诉系统我们希望按钮 B 的左侧被约束到按钮 A 的右侧。这样的位置约束意味着系统将尝试让两侧共享相同的位置。
这是可用约束的列表:
app:layout_constraintLeft(自身)_toLeftOf(相对于的控件)="相对的控件ID"
1.2 layout_constraintBaseline_toBaselineOf 基线对齐
如果设置了侧边距,它们将应用于相应的约束(如果存在)(图 ),将边距强制为目标端和源端之间的空间。通常的布局边距属性可用于此效果
2.1属性:
请注意,边距只能为正数或等于零,并且取Dimension.
2.2. 约束目标View.GONE的时候 的边距
3.1 居中定位,就是把定位控件的左边对应目标的左边 右边对应目标的右边,上边对应目标的上边
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
如上图,Button的左边位于父布局的左边,右边位于父布局的右边就做到了水平居中的效果
3.2 偏移 : 有时候居中展示还需要做出偏移效果
可以以一定角度和距离约束一个小部件中心相对于另一个小部件中心。这允许您将一个小部件定位在一个圆圈上
ConstraintLayout对标记为 的小部件进行了特定处理View.GONE。
GONE像往常一样,小部件不会被显示并且不是布局本身的一部分(即,如果标记为 ,它们的实际尺寸不会改变GONE)。
但就布局计算而言,GONE小部件仍然是其中的一部分,但有一个重要区别:
注意:
使用的边距将是 B 在连接到 A 时定义的边距(参见图 7 示例)。在某些情况下,这可能不是您想要的边距(例如,A 到其容器的一侧有 100dp 的边距,B 到 A 的边距只有 16dp,将 A 标记为已消失,B 到容器的边距为 16dp)。出于这个原因,您可以指定在连接到被标记为已消失的小部件时使用的备用边距值(请参阅 上面有关已消失的边距属性的部分 )
1.1 您可以为自身定义最小和最大尺寸ConstraintLayout
1.2 控件尺寸约束
android:layout_width可以通过 3 种不同方式设置和 android:layout_height属性 来指定控件的尺寸:
重要提示:
MATCH_PARENT不建议用于ConstraintLayout. 可以通过MATCH_CONSTRAINT将相应的左/右或上/下约束设置为来定义类似的行为"parent"。
WRAP_CONTENT (添加在 1 . 1中):强制约束
如果维度设置为WRAP_CONTENT,则在 1.1 之前的版本中,它们将被视为文字维度——也就是说,约束不会限制结果维度。虽然通常这已经足够(并且更快),但在某些情况下,您可能希望使用WRAP_CONTENT,但继续强制执行约束以限制结果维度。在这种情况下,您可以添加相应的属性之一:
MATCH_CONSTRAINT维度(添加在 1 . 1中)
当维度设置为MATCH_CONSTRAINT时,默认行为是让结果大小占用所有可用空间。有几个额外的修饰符可用:
layout_constraintWidth_min和layout_constraintHeight_min: 将设置此维度的最小尺寸
layout_constraintWidth_max和layout_constraintHeight_max: 将设置此维度的最大尺寸
layout_constraintWidth_percent和layout_constraintHeight_percent: 将此维度的大小设置为父维度的百分比
比率: 宽高比
您还可以将小部件的一个维度定义为另一个维度的比率。为此,您需要将至少一个约束维度设置为0dp(即MATCH_CONSTRAINT),并将属性设置layout_constraintDimensionRatio为给定的比率。例如:
除此之外,在设置宽高比的值的时候,还可以在前面加W或H,分别指定宽度或高度限制。 例如:
app:layout_constraintDimensionRatio="H,2:3"指的是 高:宽=2:3
app:layout_constraintDimensionRatio="W,2:3"指的是 宽:高=2:3
...
Guildline的主要属性:
Constraint 约束布局为了解决嵌套布局的弊端,更快的加载页面而出现,但是约束布局需要整体架构页面要有明确的构建页面的思维,故而学习以及思维模式要有的.所以个人感觉是简单页面还是用相对布局,线性布局就够了,对于复杂布局约束布局是你优化页面加载的不二之选.
*写作不容易,且赞且珍惜!!!*
1,先打开一张CAD图纸,如下。
2,找到输出菜单下的页面设置管理器,点击,打开如下界面。这里是在创建布局时需要使用的页面设置,推荐直接修改“布局1”。
3,点击修改按钮,出现如下页面。并按照下图设置,如下图,设置完毕点击确定。注意:如果有其他要求,可以按页面提示选择。如果一次性没有设置好,后面也是可以随时修改的。
4,返回如下页面,直接点击关闭即可。
5,点击布局标签,如下图。一般新建图纸时自带两个布局,可以直接修改这两个布局,也可以删除后新建布局。以修改为例说明。点击后如下图。
6,进入布局页面后,如果布局中已经有视口,如下图,则选中视口,输入E,回车,将其删除。
7,切换到布局菜单,添加矩形视口,如下图。
8,点击后出现创建视口选项,如下。
9,直接输入F,回车。
10,在视口内部输入Z,回车。看到命令选项,如下图。输入W,回车。选择第一张图纸,图纸1会自动布满视口。在视口外双击退出编辑视口,再次按下图进行页面设置。
11,选中视口边界线,将边界线放到一个不打印图层。在输出菜单下点击预览。预览后的效果如下。至此一个布局创建完毕。
isOpaque、tintColor、mask、isExclusiveTouch、window、isDescendant(of:)、didMoveToSuperview、didMoveToWindow、directionalLayoutMargins、layoutMargins、preservesSuperviewLayoutMargins、layoutMarginsDidChange、safeAreaInsets、safeAreaLayoutGuide、insetsLayoutMarginsFromSafeArea、constraints、addConstraint、layoutGuides、intrinsicContentSize
1、isOpaque
isOpaque属性的真实用处是给绘图系统提供一个性能优化开关!如果了解 opaque,需要点屏幕绘制的知识,屏幕上的每个像素点都是通过 RGBA 值(Red、Green、Blue 三原色再配上 Alpha 透明度)表示的,当纹理(UIView 在绘图系统中对应的表示项)出现重叠时,GPU 会按照 Result = Source + Destination * (1 - SourceAlpha)公式计算重叠部分的像素。
Result 是结果 RGB 值,Source 为处在重叠顶部纹理的 RGB值,Destination 为处在重叠底部纹理的 RGB 值。
当 SourceAlpha 为 1 时,绘图系统认为下面的颜色全部被遮盖住了,Result = Source,如果 Source 的 Alpha 不为 0,上下层颜色就会进行合成,所以 opaque 默认设置 YES,提升绘制性能,如果开发中 UIView 是不透明的,opaque 设置为YES, 如果 opaque 设置NO,那么Alpha应该小于1。
总结:isOpaque是一个性能开关,=false会走混合计算逻辑R=S+D*(1-SA)。alpha是一个显示属性,也会走混合计算逻辑。自定义UIView的时候在draw方法内使用,系统提供的类设置该属性无效。
思考:直接设置alpha就行了,opaque用处是什么?自定义UIView的时候在draw方法内使用,系统提供的类UILabel等设置该属性无效。
参考: UIView的 alpha、hidden、opaque属性之间的关系和区别
2、tintColor
具有传递性。举个例子,当我们用xib或者storyboard拖一个UIButton进入面板后,会发现UIButton的颜色为蓝色,可能有人会问为什么是这个颜色呢? 这是因为,默认情况下,一个视图的tintColor为nil,它会使用父视图tintColor属性的值。当我们为指定视图tintColor属性赋值以后,这个色值会自动传播到视图层次结构(以当前视图为根视图)中所有的子视图上。如果在视图层次结构中没有找到一个非默认的tintColor值,则会使用系统定义的颜色值(蓝色,RGB值为[0,0.478431,1]),所以这就是为什么我们拖一个button后显示的是蓝色了。对一个视图来说, 如果没有设置它的tintColor,那么它会默认使用父视图的tintColor,如果设置了这个视图的tintColor, 那么它就会把这个tintColor传递给没有设置tintColor的所有子视图。
tintColorDidChange方法会在视图的tintColor或tintAdjustmentMode属性改变时自动调用。另外,如果当前视图的父视图的tintColor或tintAdjustmentMode属性改变时,也会调用这个方法。
模式颜色:夜间模式的颜色等
思考:用处?UIImageView使用tintColor、APP设置全局TintColor
参考: 小谈iOS UIView的tintColor属性
3、clearsContextBeforeDrawing
???
假定您的PNG始终填充整个UIImageView,则应使用以下方法获得最佳性能:opaque = YES,clearsContextBeforeDrawing = NO.在此模式下,backgroundColor无关紧要.像素只需替换为新的图像数据即可.
对于单色背景上的透明PNG,最快的是:opaque = YES,clearsContextBeforeDrawing = YES和backgroundColor匹配您需要的任何内容.在这种情况下[UIColor whiteColor].
4、mask
UIView.mask和layer.mask原理相同,重叠部分显示,其他部分丢掉,重叠部分,可以这样理解,是将maskView每个point的alpha赋值给View的重叠部分相对应的point,这样view的重叠每个point都有个alpha值了,view重叠部分就可能显示多种透明色。
应用:UILabel渐进式显示(歌词同步)、UIImageView部分展示(切圆角或多图阶段展示)。mask 可以配合CAGradientLayer、CAShapeLayer 使用。可以实现蒙层透明度、显示不同形状图层、图案镂空、文字变色等等功能。mask在动画中使用,可以产生很好的动画效果。
参考: UIView的 maskView 属性
5、layerClass
提供了对外的override属性,可以替换view.layer为其他layer,如CATiledLayer 、AVPlayerLayer、TBPaperLayer等。不过可以通过另一种方式:自定义View,新加一个属性XXLayer。
layer的出现是为了mac OS 和 iOS的解耦和跨平台。
6、userInteractionEnabled
在一次动画执行流程中,动画包含的所有UIView都会被临时禁止用户交互,而不管每个UIView本身userInteractionEnabled此时的属性值是YES还是NO。但是在配置动画时,通过添加allowUserInteraction选项可以禁止这种行为的发生,使UIView即使是在执行动画期间依然能响应用户事件。userInteractionEnabled属性默认值为YES,但UIView的一些子类中对该属性进行了覆盖,并将其默认值设置为了NO,其中UIImageView和UILabel就是这样的类
7、isMultipleTouchEnabled
一个view的多指触控开关,不包含子view。不能通过设置父view=false实现两个子view不能同时点击。不影响手势。
8、isExclusiveTouch
阻止向同一window中的其他视图传递触摸事件
9、frame
frame改变将会自动重新显示,且不调用draw方法。想让调用draw方法可以设置contentMode为redraw。该属性可以动画化(alpha也可以)。如果transform包含非恒等变换时要用center和bound代替frame,否则会出问题 frame和transform的坑
10、transform
可以动画化。
改变frame的时候,不要用frame属性,用center和bound。
改anchor point的时候用CALayer的anchorPoint属性。
iOS8之后transform不能影响自动布局, AutoLayout布局与Transform的冲突
11、window
每一个view都有一个该属性,当view被add到父view上的时候,该值不在是nil,而是当前window。每个view都是事件响应者链中的一个节点,相应地,每一个节点view都有一个根节点window的引用。
12、addSubview
给next responder赋值为superview。
给window赋值。
继承父view的alpha。
view只能有一个superview,所以一个view不能加载两个view上。
13、removeFromSuperview
注意判空。
不要在视图的draw(_:)方法中调用这个方法。
14、isDescendant
是否是subview或他本身。是视图层次关系的判断。注意isMember是继承关系的判断,不一样。
15、didAddSubview
有子view才会调用。任何adding a subview 的方法都会调用该方法,默认无实现,子类可重写实现额外的操作。UIView的生命周期还有willRemoveSubview、willMove(toSuperview)、didMoveToSuperview、willMove(toWindow)、didMoveToWindow等。
remove的时候也会调用didMoveToSuperview和didMoveToWindow,只是顺序不同
16、directionalLayoutMargins
iOS11之后的,考虑到当前的语言方向(阿拉伯语是从右到左)的内容布局边距。默认为8,也可自行设置。preservesSuperviewLayoutMargins是否保护父视图边距,默认false。
17、addLayoutGuide
引入UILayoutGuide系统的一系列功能性方法之一。UILayoutGuide是 iOS 9 中增加的帮助开发者在使用auto layout布局时的一个虚拟占位对象。所有需要一个虚拟View帮助的事情都可以交给UILayoutGuide来做。它更轻量、更快速、更高效。并没有真正的创建一个View,只是创建了一个矩形空间,只在进行auto layout时参与进来计算。
18、systemLayoutSizeFitting(_ targetSize: CGSize)
该方法为视图返回一个大小值,该值最优地满足视图的当前约束,并且尽可能接近targetSize参数中的值。这个方法实际上并没有改变视图的大小。参数size可以设置layoutFittingCompressedSize或layoutFittingExpandedSize获得一个尽可能小或大的size。还可以设置fittingSizeLevel或low或high的约束优先级来返回需要的最接近或高度优先或宽度优先的大小。
思考:和sizeThatFit有什么区别?可以在layout异步布局之前拿到frame吗?
用处:可以获取自动填充的静态cell的高度。可以在autolayout时拿到size(也可以用layoutIfNeeded)。
19、intrinsicContentSize
只读属性,可通过重写来更改相应控件的内置尺寸大小,告知系统值已改变。在AutoLayout中,它作为UIView的属性(不是语法上的属性),意思就是说我知道自己的大小,如果你没有为我指定大小,我就按照这个大小来。比如:大家都知道在使用AutoLayout的时候,UILabel是不用指定尺寸大小的,只需指定位置即可,就是因为,只要确定了文字内容,字体等信息,它自己就能计算出大小来。同样的UILabel,UIImageView,UIButton等这些组件及某些包含它们的系统组件都有 Intrinsic Content Size 属性,也就说他们都有自己计算size的能力。
使用场景:自定义视图重写该方法。如在MBProgressHUD添加自定义视图时,若给定视图为不确定大小的图片,展示出来的效果就很差强人意,这时就需要更改对应View中的内置大小来适配合适的尺寸。
invalidateIntrinsicContentSize():当自定义视图中的某些内容发生变化,使其固有内容大小失效时调用此函数。这允许基于约束的布局系统在下一个布局过程中考虑新的内在内容大小。重写intrinsicContentSize时可主动调用该方法通知系统内容大小变化了。另外还有 详解 intrinsicContentSize 及 约束优先级/content Hugging/content Compression Resistance
20、alignmentRect
Autolayout系统的布局操作是基于alignment rect而非frame。绝大部分情况下它们是一样的,但是当你设置了alignmentRectInsets或者重写了alignmentRectForFrame:和frameForAlignmentRect:时就需要注意两者的差异。
alignmentRec + alignmentRectInsets = frame
forFirstBaselineLayout:使用baseLine做约束的时候autolayout会调用该方法返回的view。重写此属性以返回基于文本的子视图(例如,UILabel或非滚动的UITextView)。返回的视图必须是接收方的子视图。
应用?自定义view,重写方法返回一个view,然后设置其他基于baseline的约束
21、Debugging Auto Layout
constraintsAffectingLayout:返回影响x/y轴的视图布局的约束
hasAmbiguousLayout:视图是否有模糊(不完全确定)约束
exerciseAmbiguityInLayout:在不同的有效值之间以模糊的布局随机改变视图的约束,用于检测有效约束和必要约束
22、sizeToFit与sizeThatFits
sizeThatFits主要用于计算,返回一个最佳size,不更改view的实际大小。
sizeToFit不应该在子类中被重写,应该重写sizeThatFits,调用sizeToFit会自动调用sizeThatFits方法;
sizeToFit和sizeThatFits方法都没有递归,对subviews也不负责,只负责自己
23、setNeedsLayout
标记下一个更新周期(1/60s)中触发布局更新。由于此方法不强制立即更新,而是等待下一个更新周期,因此您可以使用它在更新任何视图之前使多个视图的布局失效。这种行为允许您将所有布局更新合并到一个更新周期中,这 通常有利于提高性能 。layoutIfNeeded:如果布局更新正在等待,则立即布局子视图。常用来在snp或masonry布局的时候获取view的frame
23、requiresConstraintBasedLayout
如果你在updateConstraints这个方法里面给自定义的控件更新控件的constraint,那么需要重写requiresConstraintBasedLayout方法,并且返回YES.否则的话,就不会显示该控件.直接在init方法中设置自定义控件的constraint,那么则不需要重写也可以显示。
translatesAutoresizingMaskIntoConstraints:将 frame 布局 自动转化为 约束布局,转化的结果是为这个视图自动添加所有需要的约束,如果我们这时给视图添加自己创建的约束就会约束冲突。
24、overrideUserInterfaceStyle
iOS13新增的设置light/dark模式。设置view之后会影响该view所在的vc的所有view(不包含child vc),设置window之后会影响window的所有view和vc。
semanticContentAttribute:设置左右布局翻转。一般用在语言翻转。也可用在按钮图片文字的左右翻转。
25、addInteraction
主要涉及UIInteraction。
UIContextMenuInteraction:iOS13可用,上下文菜单功能。如系统相册列表长按图片,弹出一个带可操作菜单的预览界面。
UIDragInteraction+UIDropInteraction:iOS11可用。在mac上可以将图片直接拖入聊天软件进行发送,可以将文档、音乐、视频文件等文件拖入相应应用程序直接进行使用。在iPhone上能应用内使用。iPad上能跨应用使用。
UIIndirectScribbleInteraction:iOS14可用。在ipad上使用apple pencil手写输入文本。
UILargeContentViewerInteraction:iOS13可用。在超大字体(辅助功能)的情况下,内容视图展示文案会很大,但是一些系统的bar button如tabbar item之类的仍然很小,这里提供一种补偿方式,手指按住的时候会弹出一个大内容视图查看器。
UIPencilInteraction:iOS12.1可用。Apple Pencil 双击的处理对象
UIPointerInteraction:iOS13.4可用。指针交互??
UIScribbleInteraction:iOS14可用。接受或抑制手写输入文本
UISpringLoadedInteraction:iOS11可用。弹簧加载交互??
UITextInteraction:iOS13可用。??
26、draw
当这个方法被调用时,UIKit已经为你的视图配置了适当的绘图环境,但是不要建立对图形上下文的强引用,因为它会在调用draw(_:)方法之间发生变化。如果你直接子类化UIView不需要调用super。如果子类化一个不同的视图类应该在你的实现中调用super。调用setNeedsDisplay方法会调用draw重新绘制。
27、viewPrintFormatter
UIViewPrintFormatter??
28、canBecomeFocused
默认值为false。此属性通知 焦点引擎 视图是否能够被聚焦。有时即使一个视图返回true,一个视图可能因为以下原因而不能被聚焦:视图是隐藏的。视图将alpha设置为0。视图将userInteractionEnabled设置为false。视图当前不在视图层次结构中。
inheritedAnimationDuration:在一个UIView animation block中获取duration的值。
29、addMotionEffect
UIMotionEffect:随着手机的倾斜微移动view
30、restorationIdentifier
视图恢复用
31、snapshotView
截图用。可用场景:添加购物车,移动交换Cel,点击放大图片。多window截图可以先逐个截图然后合并图片。直播截图是opengl实现的,要用drawHierarchy方法。
32、viewWithTag
会先遍历自己,再遍历子views。如果view和subview1是一个tag,找到的是view,而不是subview1。
33、convert(_ point
获取cell的位置。要先获取cell在列表中的位置,再获取列表在view中的位置。
34、hitTest和point(inside
返回触碰点的最佳的view。内部实现如下:
// 1.判断自己能否接收触摸事件
if (self.userInteractionEnabled == NO || self.hidden == YES || self.alpha <= 0.01) return nil
// 2.判断触摸点在不在自己范围内
if (![self pointInside:point withEvent:event]) return nil
// 3.从后往前遍历自己的子控件,看是否有子控件更适合响应此事件
35、endEditing(_ force)
让subviews中的first responder的文本控件失去响应
36、动画
demo和效果
总结:费劲弄完,效果甚微。很多api看了文档描述也不知道是什么效果和怎么使用。重点:效果、使用场景、demo。接下来计划-常用的大体都过下。不知道怎么使用的查外网或看wwdc。