配置Content Margins
考虑到当前语言方向,在视图中布局内容时使用的默认间距。
@property(nonatomic) NSDirectionalEdgeInsets directionalLayoutMargins;
// 讨论
使用此属性指定此视图及其子视图之间所需的空间量(以点为单位度量)。
根据当前布局方向,将前页边距和后页边距适当地应用于左页边距或右页边距。
例如,在从右到左的布局中,前边距应用于视图的右边缘。
对于大多数视图,默认的布局边距是每边8个点。
您可以根据接口的需要更改这些值。
对于视图控制器的根视图,此属性的默认值反映系统的最小边距和安全区域insets。
对于视图层次结构中的其他子视图,默认的布局边距通常为每边8个点,但是如果视图没有完全位于安全区域内,或者preservessuperviewlayoutmargin属性为YES,则值可能会更大。
自动布局使用你的页边距作为放置内容的提示。
例如,如果使用格式字符串“|-[subview]-|”指定一组水平约束,则子视图的前边和尾边将由相应的布局边从父视图的边插入。
当视图的边缘接近父视图的边缘,且preservessuperviewlayoutmargin属性为true时,可以增加实际的布局边距,以防止内容与父视图的边距重叠。
---------------------------------------------------------------------------------
在视图中布局内容时使用的默认间距。
@property(nonatomic) UIEdgeInsets layoutMargins;
// 讨论
在ios11及以后版本中,使用directionallayoutmargin属性来指定布局边距,而不是该属性。
directionallayoutmargin属性中的前缘和后缘插入与此属性中的左、右插入同步。
例如,在使用从左到右语言的系统上,将领先方向边缘inset设置为20点将导致此属性的左inset设置为20点。
对于视图控制器的根视图,此属性的默认值反映系统的最小边距和安全区域insets。
对于视图层次结构中的其他子视图,默认的布局边距通常为每边8个点,但是如果视图没有完全位于安全区域内,或者preservessuperviewlayoutmargin属性为YES,则值可能会更大。
此属性指定视图边缘和任何子视图之间所需的空间量(以点为单位度量)。
自动布局使用你的页边距作为放置内容的提示。
例如,如果使用格式字符串“|-[subview]-|”指定一组水平约束,则子视图的左右边缘将由父视图的边缘插入相应的布局边距。
当视图的边缘接近父视图的边缘时,preservessuperviewlayoutmargin属性为YES,实际的布局边界可能会增加,以防止内容与父视图的边界重叠。
---------------------------------------------------------------------------------
一个布尔值,指示当前视图是否也尊重其父视图的边距。
@property(nonatomic) BOOL preservesSuperviewLayoutMargins;
// 讨论
当此属性的值为YES时,在布局内容时也会考虑父视图的边距。
当视图的边缘与其父视图之间的距离小于相应的空白时,此空白会影响布局。
例如,您可能有一个内容视图,它的框架精确地匹配其父视图的边界。
当父视图的任何边距位于内容视图及其自身边距所表示的区域内时,UIKit调整内容视图的布局以尊重父视图的边距。
调整量是确保内容也在父视图的边距内所需的最小量。
此属性的默认值为NO。
---------------------------------------------------------------------------------
通知视图布局页边距已更改。
- (void)layoutMarginsDidChange;
// 讨论
这个方法的默认实现什么也不做。
子类可以覆盖此方法,并在视图的layoutmargin属性中的值发生更改时使用它来响应。
例如,如果视图子类手动处理布局或在绘图期间使用布局边距,则可能重写此方法。
在这两种情况下,都可以使用此方法启动绘图或布局更新。
找到安全区
用于确定此视图的安全区域的insets。
@property(nonatomic, readonly) UIEdgeInsets safeAreaInsets;
// 讨论
视图的安全区域反映了navigation bars、tab bars、toolbars和其他模糊视图控制器视图的祖先没有覆盖的区域。
(在tvOS中,安全区反映屏幕边框未覆盖的区域。)通过将此属性中的insets应用于视图的边界矩形,可以获得视图的安全区。
如果视图当前没有安装在视图层次结构中,或者在屏幕上还不可见,则此属性中的edge insets为0。
对于视图控制器的根视图,insets说明status bar、其他可见栏以及使用视图控制器的additionalSafeAreaInsets属性指定的任何其他insets。
对于视图层次结构中的其他视图,insets只反映被覆盖的视图的一部分。
例如,如果一个视图完全在其父视图的安全区域内,则此属性中的边缘插入量为0。
您可以在运行时使用此属性以编程方式调整视图内容的位置。
---------------------------------------------------------------------------------
layout guide表示视图中不能被bars和其他内容覆盖的部分。
@property(nonatomic, readonly, strong) UILayoutGuide *safeAreaLayoutGuide;
// 讨论
当视图在屏幕上可见时,此指南将反映视图中导航栏、选项卡栏、工具栏和其他祖先视图未覆盖的部分。
(在tvOS中,安全区反映屏幕边框未覆盖的区域。)
如果视图当前没有安装在视图层次结构中,或者在屏幕上还不可见,则布局指导边等于视图的边。
对于视图控制器的根视图,布局指南包含状态栏、其他可见栏和使用视图控制器的additionalSafeAreaInsets属性指定的任何其他insets。
对于视图层次结构中的其他视图,布局指南只反映视图中被其他内容覆盖的部分。
例如,如果一个视图完全在它的父视图的安全区域内,那么布局指导边就等于视图的边。
---------------------------------------------------------------------------------
当视图的安全区发生更改时调用。
- (void)safeAreaInsetsDidChange;
---------------------------------------------------------------------------------
一个布尔值,指示是否自动更新视图的布局空白以反映安全区域。
@property(nonatomic) BOOL insetsLayoutMarginsFromSafeArea;
// 讨论
当此属性的值为YES时,将自动修改安全区之外的任何边距,使其位于安全区边界内。
此属性的默认值为YES。
将值更改为NO允许您的边距保留在原始位置,即使它们位于安全区域之外。
管理视图的约束
视图所持有的约束。
property(nonatomic, readonly) NSArray<__kindof NSLayoutConstraint *> *constraints;
---------------------------------------------------------------------------------
在接收视图或其子视图的布局上添加约束。
- (void) addConstraint: (NSLayoutConstraint *) constraint;
// constraint
要添加到视图中的约束。约束只能引用视图本身或其子视图。
// 讨论
约束必须只包含接收视图范围内的视图。
具体地说,所涉及的任何视图必须是接收视图本身,或者是接收视图的子视图。
添加到视图中的约束被称为由视图持有。
评估约束时使用的坐标系是包含约束的视图的坐标系。
在为iOS 8.0或更高版本开发时,将约束的活动属性设置为YES,而不是直接调用addConstraint: method。
active属性会自动从正确的视图中添加和删除约束。
---------------------------------------------------------------------------------
在接收视图或其子视图的布局上添加多个约束。
- (void)addConstraints:(NSArray<__kindof NSLayoutConstraint *> *)constraints;
// constraints
要添加到视图中的约束数组。所有约束只能引用视图本身或其子视图。
// 讨论
所有约束必须只包含接收视图范围内的视图。
具体地说,所涉及的任何视图必须是接收视图本身,或者是接收视图的子视图。
添加到视图中的约束被称为由视图持有。
评估每个约束时使用的坐标系是包含约束的视图的坐标系。
在为iOS 8.0或更高版本开发时,使用NSLayoutConstraint类的activateconstr: method,而不是直接调用addConstraints: method。
activateconstr:方法自动将约束添加到正确的视图。
---------------------------------------------------------------------------------
从视图中移除指定的约束。
- (void)removeConstraint:(NSLayoutConstraint *)constraint;
// constraint
要删除的约束。删除视图不包含的约束没有效果。
// 讨论
在为iOS 8.0或更高版本开发时,将约束的活动属性设置为NO,而不是直接调用removeConstraint:方法。
active属性会自动从正确的视图中添加和删除约束。
---------------------------------------------------------------------------------
从视图中移除指定的约束。
- (void)removeConstraints:(NSArray<__kindof NSLayoutConstraint *> *)constraints;
// constraints
要删除的约束。
// 讨论
在为iOS 8.0或更高版本开发时,使用NSLayoutConstraint类的deactivateconstr:方法,而不是直接调用removeconstr:方法。
方法自动从正确的视图中移除约束。
使用布局锚创建约束
表示视图框架底部边缘的布局锚。
@property(nonatomic, readonly, strong) NSLayoutYAxisAnchor *bottomAnchor;
// 讨论
使用此锚创建视图底部边缘的约束。
您只能将此锚与其他NSLayoutYAxisAnchor锚组合使用。
有关更多信息,请参见NSLayoutAnchor。
---------------------------------------------------------------------------------
表示视图框架水平中心的布局锚。
@property(nonatomic, readonly, strong) NSLayoutXAxisAnchor *centerXAnchor;
// 讨论
使用此锚创建视图水平中心的约束。
您只能将此锚与其他NSLayoutXAxisAnchor锚组合使用。
有关更多信息,请参见NSLayoutAnchor。
---------------------------------------------------------------------------------
表示视图框架垂直中心的布局锚。
@property(nonatomic, readonly, strong) NSLayoutYAxisAnchor *centerYAnchor;
// 讨论
使用此锚创建具有视图垂直中心的约束。
您只能将此锚与其他NSLayoutYAxisAnchor锚组合使用。
有关更多信息,请参见NSLayoutAnchor。
---------------------------------------------------------------------------------
表示视图中最顶层文本行的基线的布局锚。
@property(nonatomic, readonly, strong) NSLayoutYAxisAnchor *firstBaselineAnchor;
// 讨论
对于具有多行文本的视图,此锚表示顶部一行文本的基线。
使用此锚创建与此基线相关的约束。
您只能将此锚与其他NSLayoutYAxisAnchor锚组合使用。
有关更多信息,请参见NSLayoutAnchor。
---------------------------------------------------------------------------------
表示视图框架高度的布局锚。
@property(nonatomic, readonly, strong) NSLayoutDimension *heightAnchor;
// 讨论
使用此锚创建具有视图高度的约束。
您只能将此锚与其他NSLayoutDimension锚组合使用。
有关更多信息,请参见NSLayoutAnchor。
---------------------------------------------------------------------------------
表示视图中最底部文本行的基线的布局锚。
@property(nonatomic, readonly, strong) NSLayoutYAxisAnchor *lastBaselineAnchor;
// 讨论
对于具有多行文本的视图,此锚表示底部一行文本的基线。
使用此锚创建与此基线相关的约束。
您只能将此锚与其他NSLayoutYAxisAnchor锚组合使用。
有关更多信息,请参见NSLayoutAnchor。
---------------------------------------------------------------------------------
表示视图框架前缘的布局锚。
@property(nonatomic, readonly, strong) NSLayoutXAxisAnchor *leadingAnchor;
// 讨论
使用此锚创建视图前缘的约束。
您只能将此锚与NSLayoutXAxisAnchor锚的一个子集组合使用。
你可以将一个UIView和另一个leadingAnchor,一个trailingAnchor,或者一个centerXAnchor组合起来。
有关更多信息,请参见NSLayoutAnchor。
---------------------------------------------------------------------------------
表示视图框架左边缘的布局锚。
@property(nonatomic, readonly, strong) NSLayoutXAxisAnchor *leftAnchor;
// 讨论
使用此锚创建视图左边缘的约束。
您只能将此锚与NSLayoutXAxisAnchor锚的一个子集组合使用。
你可以将一个UIView和另一个leftAnchor,一个righttanchor,或者一个centerXAnchor组合起来。
有关更多信息,请参见NSLayoutAnchor。
---------------------------------------------------------------------------------
表示视图框架右边缘的布局锚。
@property(nonatomic, readonly, strong) NSLayoutXAxisAnchor *rightAnchor;
// 讨论
使用此锚创建具有视图右边缘的约束。
您只能将此锚与NSLayoutXAxisAnchor锚的一个子集组合使用。
你可以将一个UIView和另一个right tanchor,一个left tanchor,或者一个centerXAnchor组合起来。
有关更多信息,请参见NSLayoutAnchor。
---------------------------------------------------------------------------------
表示视图框架顶部边缘的布局锚。
@property(nonatomic, readonly, strong) NSLayoutYAxisAnchor *topAnchor;
// 讨论
使用此锚创建视图顶部边缘的约束。
您只能将此锚与其他NSLayoutYAxisAnchor锚组合使用。
有关更多信息,请参见NSLayoutAnchor。
---------------------------------------------------------------------------------
表示视图框架后缘的布局锚。
@property(nonatomic, readonly, strong) NSLayoutXAxisAnchor *trailingAnchor;
// 讨论
使用此锚创建具有视图后缘的约束。
您只能将此锚与NSLayoutXAxisAnchor锚的一个子集组合使用。
你可以将一个UIView和另一个trailingAnchor,一个leadingAnchor,或者一个centerXAnchor结合起来。
有关更多信息,请参见NSLayoutAnchor。
---------------------------------------------------------------------------------
表示视图框架宽度的布局锚。
@property(nonatomic, readonly, strong) NSLayoutDimension *widthAnchor;
// 讨论
使用此锚创建具有视图宽度的约束。
您只能将此锚与其他NSLayoutDimension锚组合使用。
有关更多信息,请参见NSLayoutAnchor。
使用布局指南
将指定的布局指南添加到视图。
- (void)addLayoutGuide:(UILayoutGuide *)layoutGuide;
// layoutGuide
要添加的布局指南。
// 讨论
此方法将指定的布局指南添加到视图的layoutGuides数组的末尾。
它还将视图分配给指南的owningView属性。
每个向导只能拥有一个视图。
将指南添加到视图后,它可以使用视图的层次结构参与自动布局约束。
---------------------------------------------------------------------------------
此视图拥有的布局指南对象数组。
@property(nonatomic, readonly, copy) NSArray<__kindof UILayoutGuide *> *layoutGuides;
---------------------------------------------------------------------------------
表示视图边缘的布局指南。
@property(readonly, strong) UILayoutGuide *layoutMarginsGuide;
// 讨论
使用这个布局指南的锚来创建带有视图边距的约束。
---------------------------------------------------------------------------------
布局指南,表示视图中具有可读宽度的区域。
@property(nonatomic, readonly, strong) UILayoutGuide *readableContentGuide;
// 讨论
本布局指南定义了一个易于阅读的区域,无需强迫用户移动头部来跟踪线条。
可读内容区域遵循以下规则:
可读内容指南从不超出视图的布局边距指南。
可读内容指南垂直居中位于布局边距指南内。
可读内容指南的宽度等于或小于为当前动态文本大小定义的可读宽度。
使用可读内容指南列出一列文本。
如果要设置多个列,可以使用指南的宽度来确定列的最佳宽度。
---------------------------------------------------------------------------------
从视图中删除指定的布局指南。
- (void)removeLayoutGuide:(UILayoutGuide *)layoutGuide;
// layoutGuide
要删除的布局指南。
// 讨论
该方法从视图的layoutGuides数组中移除布局指南,并将指南的owningView属性设置为nil。
它还删除了布局指南中的任何约束。
布局指南不能参与自动布局约束,除非它们被添加到视图层次结构中的视图中。
自动布置图测量
返回基于当前约束的视图的最优大小。
- (CGSize)systemLayoutSizeFittingSize:(CGSize)targetSize;
// targetSize
您喜欢的视图大小。
要获得尽可能小的视图,请指定常量UILayoutFittingCompressedSize。
要获得尽可能大的视图,请指定常量UILayoutFittingExpandedSize。
// 返回值
视图的最佳大小。
// 讨论
该方法为视图返回一个size值,该值最优地满足视图的当前约束,并且尽可能接近targetSize参数中的值。
这个方法实际上并不改变视图的大小。
---------------------------------------------------------------------------------
根据视图的约束条件和指定的拟合优先级返回视图的最优大小。
- (CGSize)systemLayoutSizeFittingSize:(CGSize)targetSize withHorizontalFittingPriority:(UILayoutPriority)horizontalFittingPriority verticalFittingPriority:(UILayoutPriority)verticalFittingPriority;
// targetSize
您喜欢的视图大小。
要获得尽可能小的视图,请指定常量UILayoutFittingCompressedSize。
要获得尽可能大的视图,请指定常量UILayoutFittingExpandedSize。
// horizontalFittingPriority
水平约束的优先级。
指定UILayoutPriorityFittingSizeLevel以获得尽可能接近targetSize宽度值的宽度。
// verticalFittingPriority
垂直约束的优先级。指定UILayoutPriorityFittingSizeLevel以获得尽可能接近targetSize高度值的高度。
// 返回值
基于所提供的约束优先级,视图的最优大小。
// 讨论
当您在确定视图的最佳大小时,希望优先考虑视图的约束时,请使用此方法。
这个方法实际上并不改变视图的大小。
---------------------------------------------------------------------------------
接收视图的自然大小,只考虑视图本身的属性。
@property(nonatomic, readonly) CGSize intrinsicContentSize;
// 讨论
自定义视图通常显示布局系统不知道的内容。
设置此属性允许自定义视图根据其内容与布局系统通信它希望的大小。
这个内部大小必须独立于内容框架,因为无法根据高度的变化将宽度的变化动态地传递给布局系统。
如果自定义视图没有给定维度的固有大小,它可以对该维度使用UIViewNoIntrinsicMetric。
---------------------------------------------------------------------------------
使视图的内部内容大小无效。
- (void)invalidateIntrinsicContentSize;
// 讨论
当自定义视图中发生更改,使其内部内容大小无效时,请调用此函数。
这允许基于约束的布局系统在下一个布局传递中考虑新的内在内容大小。
---------------------------------------------------------------------------------
返回一个视图的优先级,在该优先级下,视图拒绝被设置为小于其固有大小。
- (UILayoutPriority)contentCompressionResistancePriorityForAxis:(UILayoutConstraintAxis)axis;
// axis
视图的轴线可能会被缩小。
// 返回值
视图应避免从其在指定轴上的固有大小压缩的优先级。
// 讨论
基于约束的布局系统在为遇到约束的视图确定最佳布局时使用这些优先级,这些约束要求视图的大小小于其固有大小。
子类不应重写此方法。
相反,自定义视图应该在创建时为其内容设置默认值,通常为UILayoutPriorityDefaultLow或uilayoutprioritydefaulleg。
---------------------------------------------------------------------------------
设置视图的优先级,以防止将其设置为小于其固有大小。
- (void)setContentCompressionResistancePriority:(UILayoutPriority)priority forAxis:(UILayoutConstraintAxis)axis;
// priority
新的优先级。
// axis
应设置抗压缩优先级的轴。
// 讨论
自定义视图应该在创建时根据它们的内容为两个方向设置默认值,通常是UILayoutPriorityDefaultLow或uilayoutprioritydefaul大腿。
当创建用户界面时,当总体布局设计需要不同于界面中使用的视图的自然优先级的权衡时,布局设计人员可以为特定视图修改这些优先级。
子类不应重写此方法。
---------------------------------------------------------------------------------
返回一个视图的优先级,在该优先级下,视图拒绝被设置为大于其固有大小。
- (UILayoutPriority)contentHuggingPriorityForAxis:(UILayoutConstraintAxis)axis;
// axis
视图的轴线可能会被放大。
// 返回值
视图应避免从其在指定轴上的固有大小进行放大的优先级。
// 讨论
基于约束的布局系统在为遇到约束的视图确定最佳布局时使用这些优先级,这些约束要求视图的大小大于其固有大小。
---------------------------------------------------------------------------------
// 设置视图的优先级,以防止将其设置为大于其固有大小。
- (void)setContentHuggingPriority:(UILayoutPriority)priority forAxis:(UILayoutConstraintAxis)axis;
// priority
新的优先级。
// axis
应该为其设置内容拥抱优先级的轴。
// 讨论
自定义视图应该在创建时根据它们的内容为两个方向设置默认值,通常是UILayoutPriorityDefaultLow或uilayoutprioritydefaul大腿。
当创建用户界面时,当总体布局设计需要不同于界面中使用的视图的自然优先级的权衡时,布局设计人员可以为特定视图修改这些优先级。
子类不应重写此方法。
在自动布局中对齐视图
返回给定框架的视图对齐矩形。
- (CGRect)alignmentRectForFrame:(CGRect)frame;
// frame
所需的相应对齐矩形的帧。
// 返回值
指定帧的对齐矩形。
// 讨论
基于约束的布局系统使用对齐矩形来对齐视图,而不是它们的frame。
这允许自定义视图根据其内容的位置进行对齐,同时仍然有一个框架,其中包含他们需要围绕其内容绘制的任何装饰,例如阴影或反射。
默认实现返回视图的框架,该框架由视图的alignmentRectInsets修改。
大多数自定义视图可以使用alignmentRectInsets来指定其内容在框架中的位置。需要任意转换的自定义视图可以覆盖alignmentRectForFrame:和frameForAlignmentRect:以描述其内容的位置。
这两种方法必须总是互为倒数。
---------------------------------------------------------------------------------
返回给定对齐矩形的视图框架。
- (CGRect)frameForAlignmentRect:(CGRect)alignmentRect;
// alignmentRect
所需的相应帧的对齐矩形。
// 返回值
指定对齐矩形的框架
// 讨论
基于约束的布局系统使用对齐矩形来对齐视图,而不是它们的框架。
这允许自定义视图根据其内容的位置进行对齐,同时仍然有一个框架,其中包含他们需要围绕其内容绘制的任何装饰,例如阴影或反射。
默认实现返回由视图的alignmentRectInsets修改的alignmentRect。
大多数自定义视图可以覆盖alignmentRectInsets来指定其内容在框架中的位置。
需要任意转换的自定义视图可以覆盖alignmentRectForFrame:和frameForAlignmentRect:以描述其内容的位置。
这两种方法必须总是互为倒数。
---------------------------------------------------------------------------------
从视图的框架中定义其对齐矩形的insets。
@property(nonatomic, readonly) UIEdgeInsets alignmentRectInsets;
// 讨论
此属性的默认值是一个NSEdgeInsets结构,其值为零。
在内容周围绘制装饰的自定义视图应使用此属性返回与内容边缘对齐的嵌套,不包括装饰。
这允许基于约束的布局系统根据视图的内容(而不仅仅是框架)对齐视图。
如果自定义视图的内容位置不能用一组简单的insets来表示,则应该覆盖alignmentRectForFrame:和frameForAlignmentRect:以描述它们在对齐矩形和框架之间的自定义转换。
---------------------------------------------------------------------------------
返回用于满足第一个基线约束的视图。
@property(readonly, strong) UIView *viewForFirstBaselineLayout;
// 讨论
对于具有多行文本的视图,第一个基线是最上面一行的基线。
当您对视图的NSLayoutAttributeFirstBaseline属性进行约束时,自动布局使用此方法返回的视图的基线。
如果该视图没有基线,则自动布局将使用视图的顶部边缘。
重写此属性以返回基于文本的子视图(例如,UILabel或非滚动UITextView)。
返回的视图必须是接收者的子视图。
默认实现返回viewForLastBaselineLayout所包含的值。
// 请注意
如果相同的子视图同时适用于第一个基线和最后一个基线,则只需要覆盖viewForLastBaselineLayout getter方法。
---------------------------------------------------------------------------------
返回用于满足最后基线约束的视图。
@property(readonly, strong) UIView *viewForLastBaselineLayout;
// 讨论
对于具有多行文本的视图,最后一个基线是最下面一行的基线。
当您对视图的NSLayoutAttributeLastBaseline属性进行约束时,自动布局使用此方法返回的视图的基线。
如果该视图没有基线,则自动布局将使用该视图的底边。
重写此属性以返回基于文本的子视图(例如,UILabel或非滚动UITextView)。
返回的视图必须是接收者的子视图。默认实现返回receive视图。
触发自动布局
一个布尔值,用于确定视图的约束是否需要更新。
- (BOOL)needsUpdateConstraints;
// 返回值
如果视图的约束需要更新,则为YES,否则为NO。
// 讨论
基于约束的布局系统使用此方法的返回值来确定是否需要在视图中调用updateconstr作为其常规布局传递的一部分。
---------------------------------------------------------------------------------
控制视图的约束是否需要更新。
- (void)setNeedsUpdateConstraints;
// 讨论
当自定义视图的属性以影响约束的方式更改时,可以调用此方法来指示约束需要在将来的某个时候更新。
然后,系统将调用updateconstr作为其正常布局传递的一部分。
将此作为优化工具来批处理约束更改。
在需要约束之前一次性更新它们,可以确保在布局传递之间对视图进行多次更改时,不会不必要地重新计算约束。
---------------------------------------------------------------------------------
更新视图的约束。
- (void)updateConstraints;
// 讨论
重写此方法以优化对约束的更改。
您应该只在更改现有约束太慢或视图产生大量冗余更改时重写此方法。
要调度更改,请调用视图上的setneedsupdateconstr。
然后,系统在布局发生之前调用updateconstr的实现。
这使您可以验证,当您的自定义视图的属性没有更改时,您的内容的所有必要约束都已就绪。
您的实现必须尽可能高效。
不要禁用所有约束,然后重新激活您需要的约束。
相反,应用程序必须有某种方法来跟踪约束,并在每次更新过程中验证它们。只更改需要更改的项。
在每次更新过程中,您必须确保对应用程序的当前状态有适当的约束。
不要在实现中调用setneedsupdateconstr。
调用setneedsupdateconstr调度另一个更新传递,创建一个反馈循环。
// 请注意
在影响更改发生后立即更新约束几乎总是更干净、更容易。
例如,如果您想更改一个约束以响应按钮点击,请直接在按钮的action方法中进行更改。
// 重要的
调用[super updateconstr]作为实现的最后一步。
---------------------------------------------------------------------------------
更新接收视图及其子视图的约束。
- (void)updateConstraintsIfNeeded;
// 讨论
每当为视图触发新的布局传递时,系统将调用此方法,以确保用当前视图层次结构及其约束中的信息更新视图及其子视图的任何约束。
此方法由系统自动调用,但如果需要检查最新的约束,则可以手动调用。
子类不应重写此方法。
调试自动布局
返回影响给定轴的视图布局的约束。
- (NSArray<__kindof NSLayoutConstraint *> *)constraintsAffectingLayoutForAxis:(UILayoutConstraintAxis)axis;
// axis
应该找到约束的轴。
// 返回值
影响指定轴的视图布局的约束。
// 讨论
返回的约束集可能不都显式地包含视图。
还可能包含影响视图位置的隐式约束。
虽然这为调试提供了一个良好的起点,但不能保证返回的约束集将包含对给定方向视图布局有影响的所有约束。
此方法只应用于调试基于约束的布局。
任何应用程序都不应该附带对该方法的调用作为其操作的一部分。
---------------------------------------------------------------------------------
一个布尔值,用于确定影响视图布局的约束是否不完全指定视图的位置。
@property(nonatomic, readonly) BOOL hasAmbiguousLayout;
// 讨论
如果视图的位置没有完全指定,则此属性的值为YES,否则为NO。
如果系统中没有足够的约束来惟一地确定布局,则认为布局是模糊的。
例如,如果系统中唯一约束是x = y + 100,布局是模棱两可的,因为有许多可能的x和y值。
UIKit并不自动检测每一个模棱两可的布局,因此您可能需要寻找模糊的症状,如视图跳跃,从一处到另一处,或者是在错误的地方。
此属性只应用于调试基于约束的布局。
任何应用程序都不应该附带使用该属性作为其操作的一部分。
---------------------------------------------------------------------------------
随机更改具有不同有效值之间的模糊布局的视图的框架。
- (void)exerciseAmbiguityInLayout;
// 讨论
该方法随机更改视图的框架,使视图在不同有效值之间的布局不明确,从而导致视图在接口中移动。
这使得可视化地标识有效帧很容易,并且可能使开发人员能够识别需要向布局添加哪些约束,从而完全指定视图的位置。
此方法只应用于调试基于约束的布局。
任何应用程序都不应该附带对该方法的调用作为其操作的一部分。
配置调整大小行为
当视图的边界发生变化时,用来确定视图如何布局其内容的标志。
@property(nonatomic) UIViewContentMode contentMode;
// 讨论
内容模式指定当视图边界更改时如何调整视图层的缓存位图。
此属性通常用于实现可调整大小的控件。
不需要每次都重新绘制视图的内容,您可以使用此属性指定要缩放内容(带或不带失真)或将它们固定到视图上的特定位置。
有关可分配给此属性的值列表,请参见UIViewContentMode。
这个属性的默认值是UIViewContentModeScaleToFill。
// 请注意
您总是可以通过调用setNeedsDisplay或setNeedsDisplayInRect:方法强制重新绘制视图的内容。
---------------------------------------------------------------------------------
选项,用于指定视图在大小更改时如何调整其内容。
typedef enum UIViewContentMode : NSInteger {
...
} UIViewContentMode;
UIViewContentModeScaleToFill
如果需要,可以通过更改内容的纵横比来调整内容的大小,以适应其自身的大小。
UIViewContentModeScaleAspectFit
通过保持高宽比来缩放内容以适应视图大小的选项。视图边界的任何剩余区域都是透明的。
UIViewContentModeScaleAspectFill
缩放内容以填充视图大小的选项。部分内容可能会被剪切以填充视图的边界。
UIViewContentModeRedraw
通过调用setNeedsDisplay方法在边界更改时重新显示视图的选项。
UIViewContentModeCenter
将内容集中在视图范围内的选项,保持比例不变。
UIViewContentModeTop
将内容居中对齐到视图边界顶部的选项。
UIViewContentModeBottom
将内容对齐到视图边界底部的中心的选项。
UIViewContentModeLeft
对齐视图左侧内容的选项。
UIViewContentModeRight
对齐视图右侧内容的选项。
UIViewContentModeTopLeft
用于对齐视图左上角的内容的选项。
UIViewContentModeTopRight
用于对齐视图右上角的内容的选项。
UIViewContentModeBottomLeft
对齐视图左下角内容的选项。
UIViewContentModeBottomRight
用于对齐视图右下角的内容的选项。
---------------------------------------------------------------------------------
要求视图计算并返回最适合指定大小的大小。
- (CGSize)sizeThatFits:(CGSize)size;
// size
视图应计算其最佳拟合size的大小。
// 返回值
适合接收子视图的新size。
// 讨论
此方法的默认实现返回视图的现有大小。
子类可以覆盖此方法,根据任何子视图的期望布局返回自定义值。
例如,UISwitch对象返回一个固定大小值,该值表示switch视图的标准大小,而UIImageView对象返回当前显示的图像的大小。
此方法不调整接收器的size。
---------------------------------------------------------------------------------
调整接收方视图的大小并移动它,使其只包含子视图。
- (void)sizeToFit;
// 讨论
当您想要调整当前视图的大小以使其使用最适当的空间时,请调用此方法。
特定的UIKit视图根据自己的内部需求调整自己的大小。
在某些情况下,如果视图没有父视图,它可能会将自己调整到屏幕边界的大小。
因此,如果您希望给定的视图将其自身大小调整到其父视图,则应该在调用此方法之前将其添加到父视图。
您不应该覆盖此方法。
如果要更改视图的默认大小信息,请覆盖sizeThatFits:。
该方法执行任何需要的计算并将其返回给该方法,然后该方法进行更改。
---------------------------------------------------------------------------------
一个布尔值,该值确定接收者是否在其边界更改时自动调整子视图的大小。
@property(nonatomic) BOOL autoresizesSubviews;
// 讨论
当设置为YES时,接收器在其边界变化时调整子视图的大小。
默认值是YES。
---------------------------------------------------------------------------------
一个整数位掩码,当它的父视图的边界发生变化时,它决定接收者如何调整自身的大小。
@property(nonatomic) UIViewAutoresizing autoresizingMask;
// 讨论
当视图的边界改变时,该视图根据每个子视图的自动调整掩码自动调整子视图的大小。
通过使用C位或运算符组合UIViewAutoresizing中描述的常量,可以指定这个掩码的值。
组合这些常量可以指定视图的哪些维度相对于父视图应该增长或收缩。
这个属性的默认值是UIViewAutoresizingNone,这表示视图根本不应该被调整大小。
当沿同一轴设置多个选项时,默认行为是在灵活的部分之间按比例分配大小差异。
相对于其他柔性部分,柔性部分越大,它可能增长得越多。
例如,假设这个属性包括UIViewAutoresizingFlexibleWidth和UIViewAutoresizingFlexibleRightMargin常数但不包括UIViewAutoresizingFlexibleLeftMargin常数,从而表明视图的左边框的宽度是固定的,但视图的宽度和右边距可能会发生变化。
因此,视图看起来锚定在其父视图的左侧,而视图宽度和视图右侧的间隙都在增加。
如果自动调整行为没有提供视图所需的精确布局,则可以使用自定义容器视图并覆盖其layoutSubviews方法来更精确地定位子视图。
布局子视图
列出了子视图。
- (void)layoutSubviews;
// 讨论
该方法的默认实现在ios5.1及更早版本上没有任何操作。
否则,默认实现使用您设置的任何约束来确定子视图的大小和位置。
子类可以根据需要重写此方法,以执行更精确的子视图布局。
只有在子视图的自动调整大小和基于约束的行为没有提供所需的行为时,才应该重写此方法。
可以使用实现直接设置子视图的框架矩形。
您不应该直接调用这个方法。
如果您想强制执行布局更新,请在下一次绘图更新之前调用setNeedsLayout方法。
如果您想立即更新视图的布局,请调用layoutIfNeeded方法。
---------------------------------------------------------------------------------
使接收器的当前布局无效,并在下一个更新周期中触发布局更新。
- (void)setNeedsLayout;
// 讨论
当您想调整视图子视图的布局时,请在应用程序的主线程上调用此方法。
此方法记录请求并立即返回。
由于此方法不强制立即更新,而是等待下一个更新周期,因此可以使用它在更新任何视图之前使多个视图的布局失效。
这种行为允许您将所有布局更新合并到一个更新周期中,这通常对性能更好。
---------------------------------------------------------------------------------
如果布局更新挂起,则立即列出子视图。
- (void)layoutIfNeeded;
// 讨论
使用此方法可强制视图立即更新其布局。
当使用自动布局时,布局引擎根据需要更新视图的位置,以满足约束中的更改。
使用接收消息的视图作为根视图,该方法将视图子树从根开始布局。
如果没有挂起布局更新,则此方法不修改布局或调用任何与布局相关的回调即可退出。
---------------------------------------------------------------------------------
一个布尔值,指示接收者是否依赖于基于约束的布局系统。
@property(class, nonatomic, readonly) BOOL requiresConstraintBasedLayout;
// 返回值
如果视图必须在使用基于约束的布局的窗口中才能正常工作,则可以,否则不行。
// 讨论
如果自定义视图不能使用自动调整大小正确布局,则应覆盖此选项以返回YES。
---------------------------------------------------------------------------------
一个布尔值,它确定视图的自动调整蒙版是否转换为自动布局约束。
@property(nonatomic) BOOL translatesAutoresizingMaskIntoConstraints;
// 讨论
如果该属性的值为YES,系统将创建一组约束,这些约束复制视图的自动调整蒙版指定的行为。
这还允许您使用视图的框架、边界或中心属性修改视图的大小和位置,允许您在自动布局中创建静态的、基于框架的布局。
注意,自动调整蒙版约束完全指定视图的大小和位置;
因此,您不能添加额外的约束来修改这个大小或位置而不引入冲突。
如果希望使用Auto Layout动态计算视图的大小和位置,必须将此属性设置为NO,然后为视图提供一组不模糊、不冲突的约束。
默认情况下,您通过编程创建的任何视图的属性都被设置为YES。
如果在Interface Builder中添加视图,系统会自动将此属性设置为NO。
网友评论