以下は、デバッグ領域に表示されるエラーメッセージです。正常に動作し、このエラーを受け取ること以外は何も問題はありません。これにより、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.
デバッグして、どの制約が "不要な制約"かを見つけることをお勧めします。次の問題があるとします。
常に問題は、次の制約とビューを見つける方法です。
これを行うには2つの解決策があります:
予期しない制約(PBOUserWorkDayHeaderView)の場所を知っているので、これをかなりうまく行う方法があります。赤い長方形でUIView
とNSLayoutConstraint
を見つけましょう。メモリ内のidを知っているのでとても簡単です。
ご覧のとおり、メモリポインターは同じです。それで、私たちは今何が起こっているかを知っています。さらに、ビュー階層でNSLayoutConstraint
を見つけることができます。ビューで選択されているため、ナビゲータでも選択されています。
必要に応じて、アドレスポインターを使用してコンソールに印刷することもできます。
(lldb) po 0x17dce920
<UIView: 0x17dce920; frame = (10 30; 300 24.5); autoresize = RM+BM; layer = <CALayer: 0x17dce9b0>>
デバッガーが指すすべての制約に対して同じことを行うことができます:-)ここで、これをどうするかを決定します。
IT BETTER(私は本当にこの方法をお勧めします、これは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
を取得したら、Find Navigatorで簡単にタップできます。その場合の簡単な修正方法は?
999
に変更してみてください。あなたが持っている問題は、NSAutoresizingMaskLayoutConstraintsがそこにあるべきではないということです。これは、スプリングとストラットの古いシステムです。それを取り除くには、制約したい各ビューでこのメソッドを実行します:
[view setTranslatesAutoresizingMaskIntoConstraints:NO];
注意、同じ方向とタイプで複数の制約を使用しないでください。
以下に例を示します。末尾の垂直制約= 15、もう1つは> = 1
時々、Xcodeは気づかない制約を作成します。 冗長な制約を取り除くを行う必要があり、ログ警告は確実に消えます。
さらに、読み取りと検出が可能いくつかの特定の理由、直接ログから:
NSLayoutConstraint:0xa338390 V:|-(15)-[UILabel:0xa331260](名前: '|':UILabel:0xa330270)>
これはUILabel制約の問題として読むことができます。これは15ptの長さの主要な垂直制約です。
NSLayoutConstraint:0x859ab20 H :-( 13)-| [UIView:0x85a8fb0] ...
これは、後続の水平制約などです。
これらの例外は非常に多く投げられました。それらを解決するための最速かつ最も簡単な方法は、例外の一意の値を見つけて、ストーリーボードのソースコードで検索することでした。これにより、問題の原因となっている実際のビューと制約を見つけることができました(すべてのビューで意味のある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"をテキストで検索する)か、少なくともいくつかの有望な候補を見つけるには、これで十分です。そこから、ストーリーボードのどのビューが実際に問題を特定できるかを実際に把握できるはずです(「重複した」固定またはサイズの制約と競合する固定を探してください)。
.xib
ファイルが自動レイアウトを使用していたため、この問題が発生しました。
ファイルインスペクターの最初のタブ。 「自動レイアウトを使用」のチェックを外すと、問題が解決しました。
このエラーの原因となっている制約を特定するのに苦労しました。より簡単な方法を次に示します。
Xcode 6.1.1を使用しています
これが私の経験と解決策です。コードには触れませんでした
Swiftこのコードを使用
view.translatesAutoresizingMaskIntoConstraints = false
各検索クエリからのSOの質問と回答に従いました。しかし、それらはすべて特定のものに関連しています。
基本的に、フォーマットを書き留める前に(単純なフォーマットでもかまいません)、警告が表示されます。
IOS 8.0からのデフォルトのビューはサイズクラスです。サイズクラスを無効にしても、いくつかの自動レイアウト制約が含まれています。
したがって、VFLを使用してコードを介して制約を設定することを計画している場合。次に、次の行の1つを処理する必要があります。
// Remove constraints if any.
[self.view removeConstraints:self.view.constraints];
私はSOで多くの検索をしましたが、解決策は Apple Sample Code にありました。
そのため、新しい制約を追加する前に、デフォルトの制約を削除する必要があります。
私にとってこの問題の主な理由は、AutoLayout
エディターでXib
のチェックを外すのを忘れたことです。実際、私はコードでXIB
の多くの調整を行いました。
for(UIView *view in [self.view subviews]) {
[view setTranslatesAutoresizingMaskIntoConstraints:NO];
}
これにより、問題の原因となっているビューを把握できました。
スイフト4
ViewDidLoadにこの行を追加するだけで問題なく動作します。
view.removeConstraints(view.constraints)
上記の答えはどれも私の状況では役に立ちません。 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を実行していると主張しています。