我可以忽略"无法同时满足约束"?

时间:2014-10-07 17:46:24

标签: ios iphone autolayout

我正在将现有应用更新为自动布局以支持更多设备尺寸。我有一些需要动画的对象,而不是使用约束我将它们设置为:

self.secondCounter.translatesAutoresizingMaskIntoConstraints = YES //example

使用旧的setFrame方法。

这似乎有效但在第一个动画上抛出了运行时错误:

  

无法同时满足约束条件。可能至少有一个   以下列表中的约束是您不想要的。尝试   这个:(1)看看每个约束并试着弄清楚你是哪个   不要指望; (2)找到添加了不需要的约束的代码或   约束并修复它。 (注意:如果你看到了   您不理解的NSAutoresizingMaskLayoutConstraints,请参阅   到UIView属性的文档   translatesAutoresizingMaskIntoConstraints)(       “”       “”       “”)

     

将尝试通过违反约束来恢复   

     

在UIViewAlertForUnsatisfiableConstraints处创建一个符号断点   在调试器中捕获它。方法中的   在UIView中列出的UIConstraintBasedLayoutDebugging类别    也可能有所帮助。 2014-10-07 19:41:12.903   AppName [5018:1153922]无法同时满足约束。     可能至少下列列表中的一个约束是一个   你不想要。试试这个:(1)看看每个约束并尝试   弄清楚你没想到的; (2)找到添加的代码   不需要的约束或约束并修复它。 (注意:如果你看到了   您不理解的NSAutoresizingMaskLayoutConstraints,请参阅   到UIView属性的文档   translatesAutoresizingMaskIntoConstraints)(       “”       “”       “”)

     

将尝试通过违反约束来恢复   

     

在UIViewAlertForUnsatisfiableConstraints处创建一个符号断点   在调试器中捕获它。方法中的   在UIView中列出的UIConstraintBasedLayoutDebugging类别    也可能会有帮助。

实际上我没有收到此消息,因为我没有对此对象设置任何约束(我听说Xcode在构建时为默认设置为自动布局xib中的每个视图设置它们。)

但不知怎的,一切看起来都不错,似乎也有效。

我可以忽略此消息,还是稍后会遇到问题?

2 个答案:

答案 0 :(得分:3)

您将肯定以后遇到问题并需要解决此问题。如果您不满足所有约束条件,并且运行时更正系统无法对数字进行捏造,则可能会导致您的应用崩溃。你可以得到像这样的令人讨厌的消息:

Fatal Exception: NSInvalidArgumentException. Unable to create description in descriptionForLayoutAttribute_layoutItem_coefficient. Something is nil

要解决自动布局问题,请按照以下简单步骤操作:

  1. 使用违规布局查找视图。它们将在右上角的故事板对象左侧列表中通过视图控制器的名称显示黄色或红色图标:
  2. the yellow icon is your guide...

    1. 通过更改框架,约束或添加新约束来解决问题。这些问题本身都有一个解释,你可以在这里找到一个很好的教程:https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/AutolayoutPG/ResolvingIssues/ResolvingIssues.html
    2. 解决了所有问题后,请务必进行测试!在模拟器和iPad(如果适用)下测试iPhone 4,5,6和6 Plus尺寸下的视图。另外,一定要在iOS 7和8下进行测试 - 在iOS 8中可以使用一些autolayout约定,但是iOS 7应用程序崩溃了。 (了解到困难的方式......)
    3. 那就是它!查找,修复,测试:)

答案 1 :(得分:0)

恕我直言,例外是红鲱鱼。

这些限制是由苹果隐含的管理。在某些时候,“那边”的几行代码可以间接地影响它们,因此发现为什么你的代码在这里引发异常是很痛苦的

在我的情况下,我发现[cell setHidden:YES]继续并用[cell removeFromSuperview]替换了该代码,问题就消失了。

.... OO编程的租户之一是使APIS安全且易于使用。不容易受伤和困惑。