153

以下は、デバッグ領域に表示されるエラー メッセージです。正常に動作し、このエラーが発生することを除いて何も問題はありません。これはアップルがアプリを受け入れるのを妨げますか? どうすれば修正できますか?

2012-07-26 01:58:18.621 Rolo[33597:11303] 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) 
(
    "<NSAutoresizingMaskLayoutConstraint:0x887d630 h=--& v=--& V:[UIButtonLabel:0x886ed80(19)]>",
    "<NSAutoresizingMaskLayoutConstraint:0x887d5f0 h=--& v=--& UIButtonLabel:0x886ed80.midY == + 37.5>",
    "<NSAutoresizingMaskLayoutConstraint:0x887b4b0 h=--& v=--& V:[UIButtonLabel:0x72bb9b0(19)]>",
    "<NSAutoresizingMaskLayoutConstraint:0x887b470 h=--& v=--& UIButtonLabel:0x72bb9b0.midY == - 0.5>",
    "<NSLayoutConstraint:0x72bf860 V:[UILabel:0x72bf7c0(17)]>",
    "<NSLayoutConstraint:0x72c2430 UILabel:0x72bfad0.top == UILabel:0x72bf7c0.top>",
    "<NSLayoutConstraint:0x72c2370 UILabel:0x72c0270.top == UILabel:0x72bfad0.top>",
    "<NSLayoutConstraint:0x72c22b0 V:[UILabel:0x72bf7c0]-(NSSpace(8))-[UIButton:0x886efe0]>",
    "<NSLayoutConstraint:0x72c15b0 V:[UILabel:0x72c0270]-(NSSpace(8))-[UIRoundedRectButton:0x72bbc10]>",
    "<NSLayoutConstraint:0x72c1570 UIRoundedRectButton:0x72bbc10.baseline == UIRoundedRectButton:0x7571170.baseline>",
    "<NSLayoutConstraint:0x72c21f0 UIRoundedRectButton:0x7571170.top == UIButton:0x886efe0.top>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x72bf860 V:[UILabel:0x72bf7c0(17)]>

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.
4

17 に答える 17

293

どの制約が「不要な制約」であるかをデバッグして見つけることをお勧めします。次の問題があるとします。

ここに画像の説明を入力

常に問題は、次の制約とビューを見つける方法です。

これを行う方法は 2 つあります。

  1. DEBUG VIEW HIERARCHY (この方法はお勧めしません)

予期しない制約 (PBOUserWorkDayHeaderView) を見つける場所がわかっているので、これをかなりうまく行う方法があります。赤い四角形でUIViewとを見つけてみましょう。メモリ内の IDNSLayoutConstraintを知っているので、非常に簡単です。

  • Debug View Hierarchyを使用してアプリを停止します。

ここに画像の説明を入力

  • 適切な UIView を見つけます。

ここに画像の説明を入力

  • 次は、気になる NSLayoutConstraint を見つけることです。

ここに画像の説明を入力

ご覧のとおり、メモリ ポインターは同じです。ですから、私たちは今何が起こっているかを知っています。NSLayoutConstraintさらに、ビュー階層で見つけることができます。Viewで選択されているので、Navigatorでも選択されています。

ここに画像の説明を入力

必要に応じて、アドレス ポインターを使用してコンソールに出力することもできます。

(lldb) po 0x17dce920
<UIView: 0x17dce920; frame = (10 30; 300 24.5); autoresize = RM+BM; layer = <CALayer: 0x17dce9b0>>

デバッガーが指し示すすべての制約に対して同じことを行うことができます:-) 次に、これをどうするかを決定します。

  1. PRINT IT BETTER (この方法を強くお勧めします。これは Xcode 7 のものです)

    • ビュー内のすべての制約に一意の識別子を設定します。

ここに画像の説明を入力

  • の簡単な拡張機能を作成NSLayoutConstraint:

スイフト:

extension NSLayoutConstraint {

    override public var description: String {
        let id = identifier ?? ""
        return "id: \(id), constant: \(constant)" //you may print whatever you want here
    }
}

目的-C

@interface NSLayoutConstraint (Description)

@end

@implementation NSLayoutConstraint (Description)

-(NSString *)description {
    return [NSString stringWithFormat:@"id: %@, constant: %f", self.identifier, self.constant];
}

@end
  • もう一度ビルドすると、より読みやすい出力が得られます。

ここに画像の説明を入力

  • 取得したら、検索ナビゲーターidでタップするだけです。

ここに画像の説明を入力

  • そしてすぐに見つけます:

ここに画像の説明を入力

そのケースを簡単に修正するには?

  • 壊れた拘束の優先順位をに変更してみてください。999
于 2015-05-07T09:09:46.640 に答える
110

あなたが抱えている問題は、 NSAutoresizingMaskLayoutConstraints がそこにあってはならないということです。これは、スプリングとストラットの古いシステムです。それを取り除くには、制約したい各ビューでこのメソッドを実行します。

[view setTranslatesAutoresizingMaskIntoConstraints:NO];
于 2012-08-24T11:53:27.630 に答える
29

同じ方向とタイプで複数の拘束を使用しないように注意してください。

例: 末尾の垂直方向の制約 = 15 で、別の制約は >= 10 です。

Xcode は、気付かない制約を作成することがあります冗長な制約を取り除く必要があり、ログの警告は確実に消えます。

ここに画像の説明を入力

さらに、ログから直接、特定の理由を読み取って検出できます。

NSLayoutConstraint:0xa338390 V:|-(15)-[UILabel:0xa331260] (名前: '|':UILabel:0xa330270 )>

これは、UILabel 制約の問題として読み取ることができます。15pt の長さの先頭の垂直制約です。

NSLayoutConstraint:0x859ab20 H:-(13)-|[UIView:0x85a8fb0]...

これは、水平方向の制約などの末尾になります。

于 2013-10-29T21:15:43.947 に答える
6

このコードを迅速に使用する

view.translatesAutoresizingMaskIntoConstraints = false
于 2016-02-22T11:55:15.627 に答える
5

.xibファイルが自動レイアウトを使用していたため、この問題が発生しました。

ファイルインスペクターで、最初のタブ。「自動レイアウトを使用」のチェックを外すと、問題は解決しました。

自動レイアウト ファイル インスペクター

于 2013-05-05T17:27:38.847 に答える
5

これが私の経験と解決策です。コードには触れていません

  1. ビューを選択 (UILabel、UIImage など)
  2. エディター > ピン留め > (選択...) スーパービューへ
  3. エディター > 自動レイアウトの問題を解決する > 不足している制約を追加する
于 2014-03-22T21:13:44.150 に答える
2

I have followed SO questions and answers from each search query. But they all are related with specific one.

At the basic, I mean before you are going to write down a format (may be a simple one) it will gives you a warnings.

From iOS 8.0 by default views are size classes. Even if you disable size classes it will still contains some auto layout constraints.

So if you are planning to set constrains via code using VFL. Then you must take care of one below line.

// Remove constraints if any.
[self.view removeConstraints:self.view.constraints];

I had search a lot in SO, but the solution was lies in Apple Sample Code.

So you must have to remove default constraints before planning to add new one.

于 2015-02-13T08:17:09.560 に答える
1
 for(UIView *view in [self.view subviews]) {
    [view setTranslatesAutoresizingMaskIntoConstraints:NO];
}

これは、問題の原因となっているビューを把握するのに役立ちました。

于 2015-10-29T12:32:02.103 に答える
1

AutoLayout私にとって、この問題の主な理由は、Xibエディターでチェックを外すのを忘れていたことです。XIB実際、インコードの多くの調整を行いました。

于 2014-10-29T21:25:10.447 に答える
1

これと同じエラーが発生しますが、最初のテキストフィールドに触れてから次のテキストフィールドに触れたときに、特定のビューでのみ発生します。

iOS 13.4用のSwiftUIで書いています

 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:0x2809b6760 'assistantHeight' TUISystemInputAssistantView:0x105710da0.height == 44   (active)>",
        "<NSLayoutConstraint:0x2809ccff0 'assistantView.bottom' TUISystemInputAssistantView:0x105710da0.bottom == _UIKBCompatInputView:0x10525ae10.top   (active)>",
        "<NSLayoutConstraint:0x2809cccd0 'assistantView.top' V:|-(0)-[TUISystemInputAssistantView:0x105710da0]   (active, names: '|':UIInputSetHostView:0x105215010 )>",
        "<NSLayoutConstraint:0x2809ca300 'inputView.top' V:|-(0)-[_UIKBCompatInputView:0x10525ae10]   (active, names: '|':UIInputSetHostView:0x105215010 )>"
    )

    Will attempt to recover by breaking constraint 
    <NSLayoutConstraint:0x2809ccff0 'assistantView.bottom' TUISystemInputAssistantView:0x105710da0.bottom == _UIKBCompatInputView:0x10525ae10.top   (active)>

    Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
    The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKitCore/UIView.h> may also be helpful.
于 2020-04-08T22:51:13.377 に答える
0

注意すべきことの 1 つは (少なくともこれでつまずきました)、間違ったビューから制約を削除していたことです。削除しようとしていた制約は、ビューの子制約ではなかったので、削除したとき

myView.removeConstraint(theConstraint)

呼び出す必要があったため、実際には何も削除していませんでした

myView.superView.removeConstraint(theConstraint)

制約は技術的には私の見解の兄弟制約であったためです。

于 2016-05-05T21:01:05.027 に答える