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 自动布局 ios 7 与 ios 8

iOS 8 的自动布局问题,代码在 iOS 7 上运行良好

iOS 8.1 中核心数据绑定的自动布局问题,但 iOS 7 中没有

高度的自动布局在 iOS 8 中工作但在 iOS 7 中不工作

iOS 8 上的自动布局问题(代码在 iOS 7 上完美运行)

iOS 7 和 8 中 UITableViewCells 的自动布局指标不同