web-dev-qa-db-ja.com

制約を同時に満たすことができず、制約を破って回復しようとします

以下は、デバッグ領域に表示されるエラーメッセージです。正常に動作し、このエラーを受け取ること以外は何も問題はありません。これにより、Appleがアプリを受け入れられなくなりますか?どうすれば修正できますか?

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.
132
Johnny Cox

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

enter image description here

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

これを行うには2つの解決策があります:

  1. デバッグ階層を表示(この方法はお勧めしません)

予期しない制約(PBOUserWorkDayHeaderView)の場所を知っているので、これをかなりうまく行う方法があります。赤い長方形でUIViewNSLayoutConstraintを見つけましょう。メモリ内のidを知っているのでとても簡単です。

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

enter image description here

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

enter image description here

  • 次に、気になるNSLayoutConstraintを見つけます。

enter image description here

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

enter image description here

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

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

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

  1. IT BETTER(私は本当にこの方法をお勧めします、これはXcode 7のものです)

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

enter image description here

  • 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
  • もう一度ビルドすると、より読みやすい出力が得られます。

enter image description here

  • idを取得したら、Find Navigatorで簡単にタップできます。

enter image description here

  • すぐに見つける:

enter image description here

その場合の簡単な修正方法は?

  • 壊れた制約のためにpriority999に変更してみてください。
247

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

[view setTranslatesAutoresizingMaskIntoConstraints:NO];
105
David Wong

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

以下に例を示します。末尾の垂直制約= 15、もう1つは> = 1

時々、Xcodeは気づかない制約を作成します。 冗長な制約を取り除くを行う必要があり、ログ警告は確実に消えます。

enter image description here

さらに、読み取りと検出が可能いくつかの特定の理由、直接ログから

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

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

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

これは、後続の水平制約などです。

28
pedrouan

これらの例外は非常に多く投げられました。それらを解決するための最速かつ最も簡単な方法は、例外の一意の値を見つけて、ストーリーボードのソースコードで検索することでした。これにより、問題の原因となっている実際のビューと制約を見つけることができました(すべてのビューで意味のある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"をテキストで検索する)か、少なくともいくつかの有望な候補を見つけるには、これで十分です。そこから、ストーリーボードのどのビューが実際に問題を特定できるかを実際に把握できるはずです(「重複した」固定またはサイズの制約と競合する固定を探してください)。

6
C James

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

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

autolayout file inspector

6

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

Xcode 6.1.1を使用しています

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

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

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

Swiftこのコードを使用

view.translatesAutoresizingMaskIntoConstraints = false
4
Arun Kumar P

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

基本的に、フォーマットを書き留める前に(単純なフォーマットでもかまいません)、警告が表示されます。

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

したがって、VFLを使用してコードを介して制約を設定することを計画している場合。次に、次の行の1つを処理する必要があります。

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

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

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

2
Kampai

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

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

これにより、問題の原因となっているビューを把握できました。

1
Grant Carlisle

スイフト4

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

view.removeConstraints(view.constraints)
1
Faris

上記の答えはどれも私の状況では役に立ちません。 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インチをシミュレートすると、このメッセージが表示されます。すべてがiOS 12.1を実行していると主張しています。

0
jsbox