iOS 7 与 iOS 8 自动布局问题
Posted
技术标签:
【中文标题】iOS 7 与 iOS 8 自动布局问题【英文标题】:iOS 7 vs iOS 8 autoloayout issues 【发布时间】:2015-04-15 06:43:16 【问题描述】:我无法解决 ios 7 的自动布局问题。请查看屏幕截图。
-
iOS 8 屏幕截图。没问题,一切正常,一切正常。
-
iOS 7 屏幕截图。注意 UI 工件。奇怪的是,每次我运行应用程序时它们都不一样。当它们发生时,它们当然会影响应用的响应能力等。
-
当这种情况发生时,我总是会遇到同样的自动布局错误。总是有 _UILayoutGuide 的东西。我尝试了一切,但无法解决这个问题。注意:在 iOS 8 上我没有任何问题。
我已经使用自动布局重新设计了整个 UI(从零开始)> 20 次。在 iOS8 上运行应用程序永远不会出现问题,总是在 iOS 7 上出现与上述相同的错误。所有的 UI 和约束都在界面构建器(故事板)中完成。所有按钮都是包含 UILabel 的 UIView,仅此而已。
有什么想法可以尝试下一步吗?
编辑:在此处复制/粘贴消息:
2015-04-15 10:01:47.725 SiolBoxDaljinec[52380:607] Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints)
(
"<NSLayoutConstraint:0x7b09a520 V:|-(0)-[UIView:0x7b099c80] (Names: '|':UIView:0x7b099ff0 )>",
"<NSLayoutConstraint:0x7b09a550 UIView:0x7b099c80.height == 0.833333*UIView:0x7b099ff0.height + 20>",
"<NSLayoutConstraint:0x7b09a5b0 V:[UIView:0x7b099c80]-(0)-[UIView:0x7b099260]>",
"<NSLayoutConstraint:0x7b09a610 UIView:0x7b099260.height == 0.166667*UIView:0x7b099ff0.height - 20>",
"<NSLayoutConstraint:0x7b09a640 V:[UIView:0x7b099260]-(0)-[_UILayoutGuide:0x7b09a220]>",
"<_UILayoutSupportConstraint:0x7b099f70 V:[_UILayoutGuide:0x7b09a220(0)]>",
"<_UILayoutSupportConstraint:0x7b096a50 _UILayoutGuide:0x7b09a220.bottom == UIView:0x7b099ff0.bottom>"
)
Will attempt to recover by breaking constraint
<NSLayoutConstraint:0x7b09a640 V:[UIView:0x7b099260]-(0)-[_UILayoutGuide:0x7b09a220]>
Break on objc_exception_throw to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful.
编辑 2:
在我更准确地检查了所有内容后,我注意到问题是 UIView,其中包含 OK/Circle(和 V+/V-/P+/P- 按钮)按钮。如果我删除此 UIView 中的每个按钮,则不再有自动布局异常。 到目前为止,我能做到的就这么多……
编辑 3:
在进一步挖掘问题后,我发现了其他可能存在问题的地方。看看下面的代码(当用户点击两个底栏按钮之一时,就会发生这种情况):
func resizeAndRepositionViewBelowViewAndThenSlideIn(sizeReference:UIView, viewControllerToPosition:UIViewController, viewReference:UIView, button:UIButton)
viewControllerToPosition.view.frame = CGRectMake(0.0, viewReference.frame.origin.y, sizeReference.frame.width, sizeReference.frame.height)
viewControllerToPosition.view.alpha = 0.0
self.view.addSubview(viewControllerToPosition.view)
button.setImage(InternalViewControllersButtonImagesSelected[button.tag], forState: UIControlState.Normal)
UIView.animateWithDuration(NSTimeInterval(MenuAnimationDuration), delay: 0.0, options: .CurveEaseOut, animations:
viewControllerToPosition.view.alpha = 1.0
viewControllerToPosition.view.frame = sizeReference.frame
, completion: finished in
self.InternalViewPresented = viewControllerToPosition
self.SubViewAnimationInProgress = false
)
看起来 autolayout 在更改视图的框架后损坏(在我的情况下,该根视图中有 2 个容器视图)。
【问题讨论】:
请复制并粘贴 text 到您的问题中,以便我们阅读我>它。里面有重要信息... 只需为圆形按钮添加纵横比即可完美圆形 是的,一切都是纵横比的(这没问题)。看来问题是@matt 在他的回答中所说的。 @sabiland 查看您的编辑 2,我想知道当您收到此错误时是否有 more 个您没有告诉我们的错误(您可能需要滚动控制台看到他们) 【参考方案1】:您的约束条件是超定的。我不知道为什么这个问题在 iOS 8 上没有出现,但很明显可以从屏幕截图中的约束列表中看出问题所在。按照顺序,我们有(我将使用视图的内存地址的最后两位来识别它们):
80 顶视图 -
V:|-(0)-[UIView:0x7b099c80]
视野高度80-
UIView:0x7b099c80.height == ...
视图 80 的底部和视图 60 的顶部之间的空间 -
V:[UIView:0x7b099c80]-(0)-[UIView:0x7b099260]>
视野高度60-
UIView:0x7b099260.height == ...
视图60的底部-
V:[UIView:0x7b099260]-(0)-[_UILayoutGuide:0x7b09a220]>
限制太多了。你可以设置顶部和高度或顶部和底部的东西,但你不能设置顶部和高度和底部 - 因为如果得到的算术有一点偏差,这些要求就不能同时满足。
【讨论】:
太好了,谢谢。我今天将对此进行实验。尽管我非常小心不要“过度设计”约束。再次是的,在 iOS8 上从来都不是问题。 请问您是如何从异常消息中扣除60、40高度的?我仍然不习惯快速理解的自动布局异常.. 我将重写以使用您粘贴的错误消息(所以现在我们将它们称为 80 和 60) 是的,就像你说的那样。谢谢。【参考方案2】:天哪,终于看起来问题是这样的:
iOS aspect ratio constraint breaks on iOS7, works on iOS8
也就是说 - 在 iOS7 上,纵横比 + 相等(高度等)的某些组合被破坏了。
【讨论】:
以上是关于iOS 7 与 iOS 8 自动布局问题的主要内容,如果未能解决你的问题,请参考以下文章
iOS 8.1 中核心数据绑定的自动布局问题,但 iOS 7 中没有
高度的自动布局在 iOS 8 中工作但在 iOS 7 中不工作