iOS 7 对比 iOS 8 自动布局问题
iOS 7 vs iOS 8 autoloayout issues
我无法解决 iOS 7 的自动布局问题。请查看屏幕截图。
- iOS 8个屏幕截图。没问题,一切正常,工作正常。
- iOS 7 个屏幕截图。注意 UI 个工件。奇怪的是,每次我 运行 应用程序时,它们都不一样。当它们发生时,它们当然会扰乱应用程序的响应能力等。
- 当这种情况发生时,我总是会遇到同样的自动布局错误。总是与 _UILayoutGuide 相关联。我尝试了一切,但无法解决这个问题。注意:在 iOS 8 我没有丝毫问题。
我用自动布局修改了整个 UI(从零开始)>20 次。 运行 在 iOS8 上安装应用程序从来没有问题,总是在 iOS7 上出现与上述相同的错误。所有 UI 和约束都在界面构建器(故事板)中完成。所有按钮都是 UI 包含 UI 标签的视图,仅此而已。
知道接下来要尝试什么吗?
编辑: Copy/Paste 此处留言:
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 在更改视图的 frame 后被破坏了(在我的例子中,根视图中有 2 个容器视图)。
你的约束被多定了。我不知道为什么这个问题没有出现在 iOS 8 上,但是在您的屏幕截图中的约束列表中可以清楚地看到问题是什么。按顺序,我们有(我将使用视图内存地址的最后两位数字来标识它们):
视图顶部 80 -
V:|-(0)-[UIView:0x7b099c80]
视野高度80 -
UIView:0x7b099c80.height == ...
视图80底部和视图60顶部之间的space -
V:[UIView:0x7b099c80]-(0)-[UIView:0x7b099260]>
视角高度60 -
UIView:0x7b099260.height == ...
视图底部 60 -
V:[UIView:0x7b099260]-(0)-[_UILayoutGuide:0x7b09a220]>
限制太多了。可以设置顶部和高度或某物的顶部和底部,但一定不能设置顶部和高度和底部-因为即使结果运算有一点偏差,也无法同时满足这些要求。
我的天啊,最后看起来问题是这样的:
iOS aspect ratio constraint breaks on iOS7, works on iOS8
也就是说 - 在 iOS7.
上某些纵横比 + 相等(高度等)的组合被打破了
我无法解决 iOS 7 的自动布局问题。请查看屏幕截图。
- iOS 8个屏幕截图。没问题,一切正常,工作正常。
- iOS 7 个屏幕截图。注意 UI 个工件。奇怪的是,每次我 运行 应用程序时,它们都不一样。当它们发生时,它们当然会扰乱应用程序的响应能力等。
- 当这种情况发生时,我总是会遇到同样的自动布局错误。总是与 _UILayoutGuide 相关联。我尝试了一切,但无法解决这个问题。注意:在 iOS 8 我没有丝毫问题。
我用自动布局修改了整个 UI(从零开始)>20 次。 运行 在 iOS8 上安装应用程序从来没有问题,总是在 iOS7 上出现与上述相同的错误。所有 UI 和约束都在界面构建器(故事板)中完成。所有按钮都是 UI 包含 UI 标签的视图,仅此而已。
知道接下来要尝试什么吗?
编辑: Copy/Paste 此处留言:
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 在更改视图的 frame 后被破坏了(在我的例子中,根视图中有 2 个容器视图)。
你的约束被多定了。我不知道为什么这个问题没有出现在 iOS 8 上,但是在您的屏幕截图中的约束列表中可以清楚地看到问题是什么。按顺序,我们有(我将使用视图内存地址的最后两位数字来标识它们):
视图顶部 80 -
V:|-(0)-[UIView:0x7b099c80]
视野高度80 -
UIView:0x7b099c80.height == ...
视图80底部和视图60顶部之间的space -
V:[UIView:0x7b099c80]-(0)-[UIView:0x7b099260]>
视角高度60 -
UIView:0x7b099260.height == ...
视图底部 60 -
V:[UIView:0x7b099260]-(0)-[_UILayoutGuide:0x7b09a220]>
限制太多了。可以设置顶部和高度或某物的顶部和底部,但一定不能设置顶部和高度和底部-因为即使结果运算有一点偏差,也无法同时满足这些要求。
我的天啊,最后看起来问题是这样的:
iOS aspect ratio constraint breaks on iOS7, works on iOS8
也就是说 - 在 iOS7.
上某些纵横比 + 相等(高度等)的组合被打破了