| - (20) - 当呼入状态栏可见时,[UIInputSetContainerView约束会中断

时间:2015-10-26 12:29:25

标签: ios objective-c ios9

当我通过在模拟器中按下Command + Y来显示“Call-in”状态栏时,我的应用程序突破了约束。它只在第一次出现呼入栏时发生。一切看起来都应该如此,但日志打印出以下内容:

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. 
(
    "<NSLayoutConstraint:0x7fb4cb9b2b60 V:|-(20)-[UIInputSetContainerView:0x7fb4cb9b1190]   (Names: '|':UITextEffectsWindow:0x7fb4cba003f0 )>",
    "<NSLayoutConstraint:0x7fb4cb942100 'UIInputWindowController-top' V:|-(0)-[UIInputSetContainerView:0x7fb4cb9b1190]   (Names: '|':UITextEffectsWindow:0x7fb4cba003f0 )>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x7fb4cb9b2b60 V:|-(20)-[UIInputSetContainerView:0x7fb4cb9b1190]   (Names: '|':UITextEffectsWindow:0x7fb4cba003f0 )>

Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful.

这是UIViewAlertForUnsatisfiableConstraints打破时的调用堆栈:

* thread #1: tid = 0x17582f, 0x0000000109bbb4c6 UIKit`UIViewAlertForUnsatisfiableConstraints, queue = 'com.apple.main-thread', stop reason = breakpoint 3.1
    frame #0: 0x0000000109bbb4c6 UIKit`UIViewAlertForUnsatisfiableConstraints
    frame #1: 0x0000000109bbb8b2 UIKit`-[UIView(UIConstraintBasedLayout_EngineDelegate) engine:willBreakConstraint:dueToMutuallyExclusiveConstraints:] + 113
    frame #2: 0x0000000107ea672b Foundation`-[NSISEngine handleUnsatisfiableRowWithHead:body:usingInfeasibilityHandlingBehavior:mutuallyExclusiveConstraints:] + 489
    frame #3: 0x0000000107d07801 Foundation`-[NSISEngine fixUpValueRestrictionViolationsWithInfeasibilityHandlingBehavior:] + 613
    frame #4: 0x0000000107d07537 Foundation`-[NSISEngine optimize] + 134
    frame #5: 0x0000000107d07da4 Foundation`-[NSISEngine withBehaviors:performModifications:] + 245
    frame #6: 0x0000000109bb5a4b UIKit`-[UIView(AdditionalLayoutSupport) _withAutomaticEngineOptimizationDisabledIfEngineExists:] + 58
    frame #7: 0x0000000109bb658e UIKit`-[UIView(AdditionalLayoutSupport) updateConstraintsIfNeeded] + 254
    frame #8: 0x0000000109ba6c46 UIKit`-[UIWindow(UIConstraintBasedLayout) updateConstraintsIfNeeded] + 108
    frame #9: 0x0000000109bb72a3 UIKit`-[UIView(AdditionalLayoutSupport) _updateConstraintsAtEngineLevelIfNeeded] + 272
    frame #10: 0x00000001093979b3 UIKit`-[UIView(Hierarchy) layoutBelowIfNeeded] + 845
    frame #11: 0x000000010936eb8b UIKit`-[UIWindow handleStatusBarChangeFromHeight:toHeight:] + 1284
    frame #12: 0x0000000109703b5b UIKit`-[UITextEffectsWindow handleStatusBarChangeFromHeight:toHeight:] + 100
  * frame #13: 0x00000001093726a7 UIKit`+[UIWindow _noteStatusBarHeightChanged:oldHeight:forAutolayoutRootViewsOnly:] + 364
    frame #14: 0x0000000109303a52 UIKit`-[UIApplication statusBar:willAnimateFromHeight:toHeight:duration:animation:] + 265
    frame #15: 0x00000001099115bb UIKit`-[UIStatusBar _requestStyleAttributes:animationParameters:forced:] + 885
    frame #16: 0x0000000109910fbf UIKit`-[UIStatusBar requestStyle:animationParameters:forced:] + 437
    frame #17: 0x0000000109910d0d UIKit`-[UIStatusBar requestStyle:animated:forced:] + 90
    frame #18: 0x00000001099160a6 UIKit`-[UIStatusBar statusBarServer:didReceiveStyleOverrides:] + 56
    frame #19: 0x0000000109904b05 UIKit`_UIStatusBarReceivedStyleOverrides + 45
    frame #20: 0x0000000109909058 UIKit`_XReceivedStyleOverrides + 33
    frame #21: 0x0000000110d67fa8 AppSupport`migHelperRecievePortCallout + 208
    frame #22: 0x000000010896c289 CoreFoundation`__CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 41
    frame #23: 0x000000010896c1f9 CoreFoundation`__CFRunLoopDoSource1 + 473
    frame #24: 0x0000000108961970 CoreFoundation`__CFRunLoopRun + 2272
    frame #25: 0x0000000108960e08 CoreFoundation`CFRunLoopRunSpecific + 488
    frame #26: 0x000000010e360ad2 GraphicsServices`GSEventRunModal + 161
    frame #27: 0x00000001092f330d UIKit`UIApplicationMain + 171
    frame #28: 0x00000001074e252f AppName`main(argc=1, argv=0x00007fff5872e688) + 111 at main.m:16
    frame #29: 0x000000010aa6b92d libdyld.dylib`start + 1
    frame #30: 0x000000010aa6b92d libdyld.dylib`start + 1

你知道为什么约束会破坏吗?我没有向UIInputSetContainerViewUITextEffectsWindowUIInputWindowController添加任何约束。

编辑:我的问题已标记为可能重复,但我建议或同意{{3}中提供的the answer }}。删除Apple自身的约束是非常危险的,只是为了摆脱这个警告。我不建议这样做。这就是为什么我也发现重复标志错了(之前已经问过这个问题而且已经有了答案。),因为答案不是我要找的那个。

2 个答案:

答案 0 :(得分:16)

看起来这是一个Apple bug。您可以验证它是否在完全空的模板项目中发生:

  • 创建新的单一视图项目
  • 在iPhone模拟器上运行
  • 按Cmd-Y切换状态栏

您将看到约束中断。

雷达是我要说的路。

答案 1 :(得分:4)

这显然是Apple的错误。我的猜测是他们有一个错误的约束,它将状态栏高度保持在20像素,但在调用栏增长时会被破坏。这不会破坏或影响应用程序,因此现在可以安全地忽略它。但应该填补苹果雷达。