制約を同時に満たすことができないため、制約を解除して回復を試みます


145

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

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.

1
このエラーはXcode 4.5でのみ発生するため、とにかく(それがリリースされるまで)App Storeに送信できません
borrrden

では、何も悪いことはありませんか?また、別のバージョンのxcodeを使用してアプリストアに送信できるようにすることはできますか?
ジョニーコックス

1
はい、何か問題がありますが、パブリックXcodeバージョンではまだ利用できないiOSの機能に関係しているため、問題はありません。4.4でコンパイルできる場合は、そのバージョンを使用してリリースできます(本日リリースされました)。
12

Xcode 4.4のOS Xアプリでこのエラーメッセージが表示されます。分かりません。
スティーブマクロード

@BartłomiejSemańczyk万が一、チャットルームに参加できますか:chat.stackoverflow.com/rooms/92522/autolayout-and-ios?申し訳ありませんがランダムですが、自動レイアウト関連のアドバイスをありがとうございます!
2015年

回答:


275

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

ここに画像の説明を入力してください

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

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

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

予期しない制約(PBOUserWorkDayHeaderView)を見つける場所がわかっているので、これをかなりうまく行う方法があります。見つけることができますUIViewし、NSLayoutConstraint赤い四角形で。私たちはメモリ内のIDを知っているので、とても簡単です。

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

ここに画像の説明を入力してください

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

ここに画像の説明を入力してください

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

ここに画像の説明を入力してください

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

ここに画像の説明を入力してください

必要な場合は、アドレスポインタを使用してコンソールに印刷することもできます。

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

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

  1. より良い印刷 (これは本当にこの方法をお勧めします。これはXcode 7のものです)

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

ここに画像の説明を入力してください

  • の簡単な拡張を作成しますNSLayoutConstraint

SWIFT

extension NSLayoutConstraint {

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

OBJECTIVE-C

@interface NSLayoutConstraint (Description)

@end

@implementation NSLayoutConstraint (Description)

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

@end
  • もう一度ビルドすると、出力が読みやすくなります。

ここに画像の説明を入力してください

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

ここに画像の説明を入力してください

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

ここに画像の説明を入力してください

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

  • 壊れた制約の優先度をに変更してみてください999

これでバグが修正されました...どうもありがとうございました。これを目的cに対してどのように行いますか?カテゴリを追加しますか?
2015年

ソリューションのThxですが、目的cで拡張機能を使用できますか?
dev.nikolaz 2015年

その識別子は、UIViewsでプログラムから利用できるaccessibilityIdentifierと同じですか。そうでない場合、識別子をプログラムでどのように設定できますか?
Arunabh Das 2015

@ダスいいえ、それは同じではありません。読むこの回答
パルトロミエSemańczyk

3
私は2番目の方法が好きで、壊れた制約をトレースするための最良の方法だと思います
Antarix

108

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

[view setTranslatesAutoresizingMaskIntoConstraints:NO];

5
setTranslatesAutoresizingMaskIntoConstraintsをNOに設定したときにビューがまったく表示されない理由は何ですか?
topwik 2013年

1
例として、SSBadgeView(UIView)を作成し、imageView subViewをSSBadgeViewに追加してから、SSBAdgeViewをサブビューとしてUIReuseableViewに追加します。SSBadgeViewにいくつかの制約を追加し、SSBadgeViewでsetTranslatesAutoresizingMaskIntoConstraints:NOを追加します。SSBadgeViewの画像subViewは期待どおりにレイアウトされますが、画像のSSBadgeView親はどこにも表示されません。
topwik 2013年

1
サブサブビューでTranslatesAutoresizingMaskIntoConstraintsを無効にするのを忘れました
Softlion

これは、このプロパティ、drive.google.com / file / d / 0BxuYs8WHXCF7bV9ndHFrQ0dMYVE /を設定するとどうなりますか? 次のコード行を使用しています:[self.contentView setTranslatesAutoresizingMaskIntoConstraints:NO]; for(UIView * view in self.contentView.subviews){[view setTranslatesAutoresizingMaskIntoConstraints:NO]; 以前、それが見えるように使用}:drive.google.com/file/d/0BxuYs8WHXCF7OWlvZGQwN3FlbzQ/... これは、しかし働いていた、私は言わなければなりません。
rptwsthi 2015

28

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

例: トレーリングの垂直拘束= 15、別の拘束は> = 10。

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

ここに画像の説明を入力してください

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

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

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

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

これは、後続の水平拘束などになります。


6

私はこれらの例外を数多く投げましたが、それらを解決するために見つけた最速かつ最も簡単な方法は、ストーリーボードのソースコードで検索した例外の一意の値を見つけることでした。これは、問題の原因となっている実際のビューと制約を見つけるのに役立ちました(すべてのビューで意味のあるuserLabelsを使用しているため、制約とビューの追跡が非常に簡単になります)...

したがって、上記の例外を使用して、ストーリーボードを「ソースコード」としてxcode(または別のエディター)で開き、見つけられるものを探します...

<NSLayoutConstraint:0x72bf860 V:[UILabel:0x72bf7c0(17)]> 

..これは、値が(17)のUILabelの垂直(V)制約のように見えます。

私も見つけた例外を見て

<NSLayoutConstraint:0x72c22b0 V:[UILabel:0x72bf7c0]-(NSSpace(8))-[UIButton:0x886efe0]>

これは、UILabel(0x72bf7c0)がUIButton(0x886efe0)に近く、垂直方向の間隔(8)があるように見えます。

これで、ストーリーボードのソースコードで特定のビュー(おそらく「17」のテキストを最初に検索することによる)、または少なくともいくつかの候補を見つけることができれば幸いです。そこから、ストーリーボードにどのビューがあるかを実際に把握できるため、問題の特定が非常に簡単になります(「重複した」ピン留めまたはサイズの制約と競合するピン留めを探します)。


「意味のあるuserLabelsを使用しています」-このコンテキストのuserLabelsとは何ですか?(どのように設定するかなど)
Stripes

IDインスペクタのドキュメントセクションには、ストーリーボードのソースコードの「userLabel」値に変換されるフィールド「Label」..があります。
C James

左側の[概要]パネルで選択したビューをクリックして設定することもできます(ファインダーでファイルの名前を変更するのと少し似ています)
C James

1
恐ろしい「制約を同時に満たすことができない」という問題を解決することに関して、私が読んだ最良のことでしょう。痛み。この時点で表示されているオブジェクト「制約を解除して回復しようとします<NSLayoutConstraint:」は通常原因であり、C Jamesが言うように、おそらく高さまたは幅の制約が固定制約と競合しています。高さを削除するのは難しいと思いましたが、制約が正しかったので、他の制約から高さを収集できました。高さの制約を追加すると、自動レイアウトが混乱してしまいました。そのため、これを探しています。
latenitecoder

6

このエラーの原因となっている制約を特定するのに苦労しました。簡単な方法を次に示します。

Xcode 6.1.1を使用しています

  1. すべてのUILabels、UIImagesなどを選択するための「コマンド+ A」
  2. エディター->ピン>(選択...)をクリックしてスーパービューにします
  3. もう一度[エディタ]-> [自動レイアウトの問題を解決]-> [不足している制約を追加]または[推奨される制約にリセット]をクリックします。それはあなたのケースに依存します。

5

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

ファイルインスペクタの最初のタブ。「Use Autolayout」のチェックを外すと問題が解決しました。

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


それで問題は解決しましたが、画面の上部にある 'UIImageView'(ナビゲーションバーとして使用していました)が画面の下部に移動しました。それがなぜ起こったのか知っていますか?
Dietbacon 2013

1
Autolayoutは制約を使用してオブジェクトのレイアウトを管理します。自動レイアウトを無効にしただけなので、これらの制約はおそらくなくなっており、位置UIImageViewが変更されています。プログラムまたはInterface Builderを使用して、この位置を再度設定する必要があります。
ステファンBruckert

5

これが私の経験と解決策です。コードには触れなかった

  1. ビューを選択(UILabel、UIImageなど)
  2. Editor> Pin>(Select ...)to Superview
  3. エディター>自動レイアウトの問題の解決>不足している制約の追加

4

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

view.translatesAutoresizingMaskIntoConstraints = false

1
これは、objective-cタグ付きの質問に対する迅速な回答です。
Tobi Nary 2016

2
@SmokeDispenserとにかくこれは迅速なコードであると述べました。そしてそれは私のために働いています。迅速/客観的な共通のココアタッチSDKがあります。
Arun Kumar P

2

私は各検索クエリからのSOの質問と回答を追跡しました。しかし、それらはすべて特定のものと関連しています。

基本的には、フォーマットを書き留める前に(単純なフォーマットの可能性があります)、警告が表示されます。

iOS 8.0以降では、デフォルトのビューはサイズクラスです。サイズクラスを無効にしても、自動レイアウト制約がいくつか含まれます。

したがって、VFLを使用してコードで制約を設定する場合は、次に、以下の行の1つに注意する必要があります。

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

私はSOで多くの検索を行いましたが、解決策はApple Sample Codeにありました。

したがって、新しい制約を追加する前に、デフォルトの制約を削除する必要があります。


1

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


1
 for(UIView *view in [self.view subviews]) {
    [view setTranslatesAutoresizingMaskIntoConstraints:NO];
}

これは、問題の原因となっている見解を理解するのに役立ちました。


1

上記の答えはどれも私の状況では役に立ちません。XCode 10.1を実行していて、「iPad(第5世代)」のシミュレータでアプリをテストしています。シミュレーターはiOS 12.1を実行しています。

ストーリーボードに、2つのUITextFieldサブビューを持つ単純なルートビューがあります。ストーリーボードで使用されている制約はまったくありません。また、アプリまたはストーリーボードにUIButtonBarViewオブジェクトがありません。

アプリが起動してルートビューをレイアウトしても、メッセージは出力されません。シミュレートされたデバイスが回転している場合はなし。

しかし、シミュレーターでは、テキストフィールドの1つをクリックすると、シミュレーターに表示されないように見えるフルキーボードではなく、画面の下部からキーボード拡張が表示されます。しかし、以下はターミナルに出力されます:

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:0x6000034e7700 h=--& v=--& UIKeyboardAssistantBar:0x7f9c7d714af0.height == 0   (active)>",
"<NSLayoutConstraint:0x6000034aba20 V:|-(0)-[_UIUCBKBSelectionBackground:0x7f9c7d51ec70]   (active, names: '|':_UIButtonBarButton:0x7f9c7d51de40 )>",
"<NSLayoutConstraint:0x6000034aba70 _UIUCBKBSelectionBackground:0x7f9c7d51ec70.bottom == _UIButtonBarButton:0x7f9c7d51de40.bottom   (active)>",
"<NSLayoutConstraint:0x6000034fb3e0 V:|-(0)-[_UIButtonBarStackView:0x7f9c7d715880]   (active, names: '|':UIKeyboardAssistantBar:0x7f9c7d714af0 )>",
"<NSLayoutConstraint:0x6000034fb750 V:[_UIButtonBarStackView:0x7f9c7d715880]-(0)-|   (active, names: '|':UIKeyboardAssistantBar:0x7f9c7d714af0 )>",
"<NSLayoutConstraint:0x6000034abc00 'UIButtonBar.maximumAlignmentSize' _UIButtonBarButton:0x7f9c7d51de40.height == UILayoutGuide:0x600002ef4e00'UIViewLayoutMarginsGuide'.height   (active)>",
"<NSLayoutConstraint:0x6000034d7cf0 'UIView-bottomMargin-guide-constraint' V:[UILayoutGuide:0x600002ef4e00'UIViewLayoutMarginsGuide']-(9)-|   (active, names: '|':_UIButtonBarStackView:0x7f9c7d715880 )>",
"<NSLayoutConstraint:0x6000034d7c50 'UIView-topMargin-guide-constraint' V:|-(10)-[UILayoutGuide:0x600002ef4e00'UIViewLayoutMarginsGuide']   (active, names: '|':_UIButtonBarStackView:0x7f9c7d715880 )>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x6000034aba70 _UIUCBKBSelectionBackground:0x7f9c7d51ec70.bottom == _UIButtonBarButton:0x7f9c7d51de40.bottom   (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.

これはすべて、私のアプリの何にも関係なく、Appleが独自のキーボードビューを作成する方法に関連するすべてのことと、私の小さな拡張機能を組み合わせて宣言した場合でも、確かに私には思えます。

だから問題は残っています、私がアプリ開発者として私がやるべきことは何かあると思いますか(これは注意する価値のあるものだと思います)、それともApple自身の問題/バグですか?

FWIW、この制約問題のメッセージは、iPad Pro 12.9インチ(第3世代)などの新しいiPadモデルをシミュレーションする場合には発生しません。しかし、メッセージはiPad Pro 9.7-inchをシミュレートするときに表示されます。


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.

0

xibのviewCircleについても、ログの制約違反の同じ問題が発生していました。上記のすべてを試してみましたが、何もうまくいきませんでした。次に、ログで壊れていた高さ制約の優先度を変更しようとしました(xibの制約の識別子を追加することで確認されました)ここに画像の説明を入力してください


-1

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

myView.removeConstraint(theConstraint)

電話が必要だったので、実際には何も削除していませんでした

myView.superView.removeConstraint(theConstraint)

制約は私の見解では技術的に兄弟の制約だったからです。


-4

迅速4

この行をviewDidLoadに追加するだけで問題なく動作します。

view.removeConstraints(view.constraints)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.