iOS 7 对比 iOS 8 自动布局问题

iOS 7 vs iOS 8 autoloayout issues

我无法解决 iOS 7 的自动布局问题。请查看屏幕截图。

  1. iOS 8个屏幕截图。没问题,一切正常,工作正常。

  1. iOS 7 个屏幕截图。注意 UI 个工件。奇怪的是,每次我 运行 应用程序时,它们都不一样。当它们发生时,它们当然会扰乱应用程序的响应能力等。

  1. 当这种情况发生时,我总是会遇到同样的自动布局错误。总是与 _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.

上某些纵横比 + 相等(高度等)的组合被打破了