关于如何检测是否缺少约束有两个关键的方法hasAmbiguousLayout和exerciseAmbiguityInLayout,下面我可以看下该方法的官方文档介绍.
hasAmbiguousLayout
The value of this property is true if the view’s location is incompletely specified, false otherwise.
If there aren't enough constraints in the system to uniquely determine layout, the layout is considered ambiguous. For example, if the only constraint in the system is x = y + 100, the layout is ambiguous because there are many possible values for x and y. UIKit does not automatically detect every ambiguous layout, so you may need to look for symptoms of ambiguity, such as views that jump from place to place, or that are in the wrong place.
This property should only be used for debugging constraint-based layout. No app should ship with usage of this property as part of its operation.
如果视图的位置未完全指定,该属性的值为true,否则为false。
如果系统中没有足够的约束来惟一地确定布局,则认为该布局是不明确的。例如,如果系统中唯一约束是x = y + 100,布局是模棱两可的,因为有许多可能的x和y值。UIKit并不自动检测每一个模棱两可的布局,因此您可能需要寻找模糊的症状,如视图跳跃,从一处到另一处,或者是在错误的地方。
此属性应仅用于调试基于约束的布局。任何应用程序都不应该使用此属性作为其操作的一部分。
exerciseAmbiguityInLayout
This method randomly changes the frame of a view with an ambiguous layout between its different valid values, causing the view to move in the interface. This makes it easy to visually identify what the valid frames are and may enable the developer to discern what constraints need to be added to the layout to fully specify a location for the view.
This method should only be used for debugging constraint-based layout. No application should ship with calls to this method as part of its operation.
这个方法随机改变视图的框架,在不同的有效值之间使用不明确的布局,从而导致视图在接口中移动。这样可以很容易地从视觉上确定有效的框架是什么,也可以使开发人员能够辨别需要在布局中添加哪些约束,以完全指定视图的位置。
此方法只能用于调试基于约束的布局。任何应用程序都不应该将对该方法的调用作为其操作的一部分。
我们可以对是否调用hasAmbiguousLayout方法,根据返回的布尔值,判断是否存在约束丢失.在某些情况下,即使约束丢失,可能在当前的机型和系统版本上显示也会正常,但是不代表他没有问题.
我们可以让视图调用exerciseAmbiguityInLayout方法,
cusImgView.snp.makeConstraints { (make) in
make.top.equalToSuperview().offset(10)
make.centerY.equalToSuperview()
make.height.equalTo(100).priority(.medium)
make.width.equalTo(100)
// make.left.equalToSuperview()
}
现在添加一个图片视图,可以看到是缺少左部或者中心约束的,但是在模拟器上,他们都排列在左侧,在某些情况下,可能展示的位置和设计要求的位置是一样的,但是不能代表没有问题.
截屏2020-11-19 上午11.25.34.png
如果在celll中打开layoutSubviews,在视图滑动中会调用该方法,如果我们调用exerciseAmbiguityInLayout
override func layoutSubviews() {
super.layoutSubviews()
self.cusImgView.exerciseAmbiguityInLayout()
}
可以看到异常情况的发生.
截屏2020-11-19 上午11.25.19.png
该视图由于在x轴方向缺少约束会导致上面的结果.这样在开发中,可以方法我们的检测视图约束丢失的问题.
网友评论