web-dev-qa-db-ja.com

同時に制約を満たすことはできません-制約はありません

個々のユーザー制約をすべて削除して削除しましたが、デバイスを回転させた後、まだ次のエラーが発生しています[〜#〜] only [〜#〜]なぜだかまったくわからない。誰にもアイデアはありますか?

2013-01-14 21:30:31.363 myApp[35869:c07] 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:0x84543d0 h=--& v=--& V:[UIView:0xa330270(768)]>",
    "<NSLayoutConstraint:0xa338350 V:[UIView:0xa331260]-(-1)-|   (Names: '|':UIView:0xa330270 )>",
    "<NSLayoutConstraint:0xa338390 V:|-(841)-[UIView:0xa331260]   (Names: '|':UIView:0xa330270 )>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0xa338350 V:[UIView:0xa331260]-(-1)-|   (Names: '|':UIView:0xa330270 )>

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.
56
The Crazy Chimp

これらを一つ一つ見ていきましょう。

"<NSAutoresizingMaskLayoutConstraint:0x84543d0 h=--& v=--& V:[UIView:0xa330270(768)]>"

これは、ビュー0xa330270([〜#〜] a [〜#〜])が768ポイントの高さでなければならないことを意味しています。

"<NSLayoutConstraint:0xa338350 V:[UIView:0xa331260]-(-1)-| (Names: '|':UIView:0xa330270 )>"

これは、ビュー0xa331260([〜#〜] b [〜#〜])の最下部エッジが[〜#〜] aの最下部から-1のギャップでなければならないということです。 [〜#〜]、これはスーパービューです。

"<NSLayoutConstraint:0xa338390 V:|-(841)-[UIView:0xa331260] (Names: '|':UIView:0xa330270 )>"

これは、[〜#〜] b [〜#〜]のトップエッジは、スーパービューのトップから841ポイントのギャップでなければならないということです。[〜#〜] a [〜#〜]

これらの3つのすべてを真にすることはできません-[〜#〜] a [〜#〜]は768ポイントの高さにすることはできず、上部からのエッジ841ポイントの挿入を含むサブビューを含むことができます下から-1ポイントのインセット。これらの各制約をどこで定義しましたか?

達成しようとしているレイアウトについては説明していませんが、スーパービューに自動サイズ変更マスクがあり、デバイスの回転時に高さが変化しないように見えます。私の知る限り、自動サイズ変更の制約は、ストーリーボードまたはxibがすべて自動レイアウトであるかそうでないため、プログラムでビューを追加した場合にのみ表示されます。自動レイアウトビュー(ペン先から読み込まれたビュー)を非自動レイアウトペン先から別のビューに追加するようなことをしている場合を除きますか?

96
jrturton

http://useYourLoaf.com に感謝します。この完全なソリューション:

http://useyourloaf.com/blog/using-identifiers-to-debug-autolayout.html

クイックレイアウトに関するWWDC 2015セッションに埋もれていることがわかったクイックヒントは、制約に関する問題をデバッグするときに役立ちます

自動レイアウトを使用している場合は、何か問題が発生したときにXcodeが出力するログに精通しています。サンプルを作成するには、 my Stack Viewサンプルコード を変更し、各画像に240の固定幅を与えるための制約を追加しました(これは、後で説明するように良い考えではありません)。

enter image description here

IPadなどの通常の幅のビューでは機能しますが、iPhoneのような縦長のコンパクトな幅のビューには幅が広すぎます。実行時のコンソールログは読むのが面白くありません。定型テキストをスキップすると、問題のある制約のリストが表示されます。

"<NSLayoutConstraint:0x7fc1ab520360 H:[UIImageView:0x7fc1ab532650(240)]>",
"<NSLayoutConstraint:0x7fc1ab536ef0 H:[UIImageView:0x7fc1ab537380(240)]>",
"<NSLayoutConstraint:0x7fc1ab545cc0 UIView:0x7fc1ab53d870.trailingMargin == UIStackView:0x7fc1ab53dae0.trailing>",
"<NSLayoutConstraint:0x7fc1ab545d10 UIStackView:0x7fc1ab53dae0.leading == UIView:0x7fc1ab53d870.leadingMargin>",
"<NSLayoutConstraint:0x7fc1ab54e240 'UISV-alignment' UIStackView:0x7fc1ab53dc70.centerX == UIStackView:0x7fc1ab531a10.centerX>",
"<NSLayoutConstraint:0x7fc1ab5167c0 'UISV-canvas-connection' UIStackView:0x7fc1ab531a10.leading == UIImageView:0x7fc1ab532650.leading>",
"<NSLayoutConstraint:0x7fc1ab54ad80 'UISV-canvas-connection' H:[UIImageView:0x7fc1ab537380]-(0)-|   (Names: '|':UIStackView:0x7fc1ab531a10 )>",
"<NSLayoutConstraint:0x7fc1ab5397d0 'UISV-canvas-connection' UIStackView:0x7fc1ab53dae0.leading == _UILayoutSpacer:0x7fc1ab54c3c0'UISV-alignment-spanner'.leading>",
"<NSLayoutConstraint:0x7fc1ab54a4a0 'UISV-canvas-connection' UIStackView:0x7fc1ab53dae0.centerX == UIStackView:0x7fc1ab53dc70.centerX>",
"<NSLayoutConstraint:0x7fc1ab54b110 'UISV-spacing' H:[UIImageView:0x7fc1ab532650]-(16)-[UIImageView:0x7fc1ab537380]>",
"<NSLayoutConstraint:0x7fc1ab548210 'UISV-spanning-boundary' _UILayoutSpacer:0x7fc1ab54c3c0'UISV-alignment-spanner'.leading <= UIStackView:0x7fc1ab531a10.leading>",
"<NSLayoutConstraint:0x7fc1ab551690 'UIView-Encapsulated-Layout-Width' H:[UIView:0x7fc1ab53d870(375)]>"

ログは、上記の制約のどれを破ることにしたかを示します。

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x7fc1ab536ef0 H:[UIImageView:0x7fc1ab537380(240)]>

ログ出力はビジュアルレイアウト形式の自動レイアウト言語を使用しますが、システムによって作成された制約から自分の制約を見つけるのは困難です。これは特に、ほとんどの制約を作成するための設計によるスタックビューの場合です。この些細な例では、追加したばかりの固定幅の制約を知っていますが、ログからはわかりにくく、ビューが複雑になるほど難しくなります。

制約への識別子の追加

各制約に識別子を追加すると、ログがはるかに理解しやすくなります(NSLayoutConstraintにはiOS 7以降の識別子プロパティがあります)。 Interface Builderで制約を見つけて、Attributesインスペクターに識別子を追加します(ログで目立つようにプレフィックス/サフィックスとして$を使用しています)。

enter image description here

アップデート2015年8月18日:コメントで指摘したように、識別子はXcode 7以降のInterface Builderでのみ編集できます。Xcode6.4では表示されません。

コードに制約を追加する場合:

constraint.identifier = "$HeartImageFixedWidth$"

制約の配列を使用する視覚形式言語を使用している場合は、注意が必要です。たとえば、Swift=コードフラグメントを検討して、心臓画像ビューの固定幅制約を作成します。

let heartWidth = NSLayoutConstraint.constraintsWithVisualFormat("[heart(240)]", 
                 options:[], metrics:nil, views:viewsDictionary)

HeartWidthは[NSLayoutConstraint]型の配列であるため、識別子の設定にはもう少し手間がかかります。

for constraint in heartWidth {
  constraint.identifier = "$HeartImageFixedWidth$"
}
heartImage.addConstraints(heartWidth)

制約に識別セットを設定すると、ログファイルでそれらを見つけるのがはるかに簡単になりました(最初の4行を参照)。

"<NSLayoutConstraint:0x7f92a305aeb0 '$ContainerStackViewLeading$' UIStackView:0x7f92a3053220.leading == UIView:0x7f92a3052fb0.leadingMargin + 32>",
"<NSLayoutConstraint:0x7f92a305b340 '$ContainerStackViewTrailing$' UIView:0x7f92a3052fb0.trailingMargin == UIStackView:0x7f92a3053220.trailing + 32>",
"<NSLayoutConstraint:0x7f92a301cf20 '$HeartImageFixedWidth$' H:[UIImageView:0x7f92a3047ef0(240)]>",
"<NSLayoutConstraint:0x7f92a3009be0 '$StarImageFixedWidth$' H:[UIImageView:0x7f92a304d190(240)]>",
"<NSLayoutConstraint:0x7f92a3060cc0 'UISV-alignment' UIStackView:0x7f92a30533b0.centerX == UIStackView:0x7f92a30472b0.centerX>",
"<NSLayoutConstraint:0x7f92a301c590 'UISV-canvas-connection' UIStackView:0x7f92a30472b0.leading == UIImageView:0x7f92a3047ef0.leading>",
"<NSLayoutConstraint:0x7f92a305f680 'UISV-canvas-connection' H:[UIImageView:0x7f92a304d190]-(0)-|   (Names: '|':UIStackView:0x7f92a30472b0 )>",
"<NSLayoutConstraint:0x7f92a3064190 'UISV-canvas-connection' UIStackView:0x7f92a3053220.leading == _UILayoutSpacer:0x7f92a30608a0'UISV-alignment-spanner'.leading>",
"<NSLayoutConstraint:0x7f92a30415d0 'UISV-canvas-connection' UIStackView:0x7f92a3053220.centerX == UIStackView:0x7f92a30533b0.centerX>",
"<NSLayoutConstraint:0x7f92a305fa10 'UISV-spacing' H:[UIImageView:0x7f92a3047ef0]-(16)-[UIImageView:0x7f92a304d190]>",
"<NSLayoutConstraint:0x7f92a30508c0 'UISV-spanning-boundary' _UILayoutSpacer:0x7f92a30608a0'UISV-alignment-spanner'.leading <= UIStackView:0x7f92a30472b0.leading>",
"<NSLayoutConstraint:0x7f92a3063240 'UIView-Encapsulated-Layout-Width' H:[UIView:0x7f92a3052fb0(375)]>"

また、システムがどの制約を破ることを選択したかがより明確になります。

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x7f92a3009be0 '$StarImageFixedWidth$' H:[UIImageView:0x7f92a304d190(240)]>

制約に識別子を追加するのは手間がかかるわけではありませんが、次に複雑なレイアウトのデバッグログをソートする必要がある場合に効果があります。

さらに読む

13

これは一般的なエラーではないと思いますが、素人のやり方でいくらか解決しました。上記のような不可解なメッセージを受け取っていました。それを理解するために、ダミービュークラスを作成し、ストーリーボードのビューに添付しました。たとえば、UIViewがある場合、AddressViewというクラスを作成し、ストーリーボードのこのビューにアタッチしました。それは少し時間がかかりますが、それは私のために働いた。その後、オブジェクトIDの代わりに、問題を引き起こしているビューに簡単に焦点を合わせるのに役立つクラス名を取得しました。私のエラーメッセージは今読んで、

2013-07-02 04:16:20.434 Myproject [2908:c07] 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) 
(
    "<NSLayoutConstraint:0x9edeae0 V:|-(0)-[AddressView:0x143ee020]   (Names: '|':MainView:0x129eb6a0 )>",
    "<NSAutoresizingMaskLayoutConstraint:0x11e998c0 h=--& v=--& V:[MainView:0x129eb6a0(704)]>",
    "<NSLayoutConstraint:0x156720b0 V:[AddressView:0x143ee020]-(896)-|   (Names: '|':MainView:0x129eb6a0 )>"
)

ここで、MainViewとAddressビューの名前が問題の原因であることがわかります。

それを解決するために、サブビュー(この場合はアドレスビュー)を移動し、位置を変更しました。この問題は、Xcode 4.5の新しい自動Layourと古いスキルを組み合わせて使用​​するか、ビューを手動で配置することから始まったと思います。

とにかく、それが勤勉よりも幸運だったかどうかはわかりませんが、それでもこれはデバッグの別の方法かもしれません。たぶんこれは誰かを助ける!

9
DrBug

基本を知る価値があり、Apple/Xcodeがログを通してあなたに伝えようとしていることを理解する

H = Horizontal constraint(for leading and Trailing)
V = Vertical constraint(top and bottom Edge)
h = height
w = width

TopEdge    -> V:|-(points)-[VIEW:memoryAddress] 
BottomEdge -> V:[VIEW:memoryAddress]-(points)-|
Leading    -> H:|-(points)-[VIEW:memoryAddress] 
Trailing   -> H:[VIEW:memoryAddress] -(points)-|
height     -> h= --& v=--& V:[VIEW:memoryAddress((points)] 
width      -> VIEW:memoryAddress.width == points 
between    -> H:[VIEW 1]-(51)-[VIEW 2] 

これを理解したら、特定のエラーを読むのはとても簡単です

6
Naishta

YourConstraintView.translatesAutoresizingMaskIntoConstraints = NO;

私のためにやった。

4
tsuz

XibファイルからすべてのtranslatesAutoresizingMaskIntoConstraintsプロパティを削除することでこの問題を修正しました(ソースコードとしてxibを開きます)。

3
Danil

ワンノート。個人のホットスポット接続を使用してテストしている場合、ログにこのエラーが表示され、ホットスポットのステータスバーは上部にあります。制約がなくなります。

これが誰かの助けになることを願っています。

2
nab

私はこの問題を抱えていて、問題の原因を突き止めるのに2日かかりました。

コードでストーリーボードをプログラムで開く場合は、次のようにしてください。

UIStoryboard *story = [UIStoryboard storyboardWithName:@"MovieMaker" bundle:nil];
    UIViewController *vc = [story instantiateInitialViewController];
    //this causes layout to break [self presentViewController:vc animated:YES completion:nil];
    [self showViewController:vc sender:nil];

(presentViewControllerを使用して)コメント付きの行を使用しており、方向のバグが発生し、制約ではない制約の競合がスローされました... showViewControllerに変更すると、すべての制約の競合がなくなり、方向が動作します......(それがショーではなく存在するのになぜ機能するのかを本当に知っています...それはまだだと思っています...エイリアン...)

0
rickrvo

デバッグコンソールで生成された「制約を同時に満たすことができません」というメッセージの問題は、XCode 9.4でも発生します。
iPadシミュレーターの特定のインスタンスでは、メッセージが生成されます。
1)特定のUITextFieldにフォーカスを置く場合のみ。
2)ビューの制約がすべて削除されている場合でも。
2)すべての表示制約がある場合でも、「推奨される制約にリセット」。

ただし、ソフトウェアキーボードをオンに切り替えて表示すると、メッセージは生成されません。したがって、この問題にどのくらいの時間を費やす必要がありますか。私の場合は、ソフトウェアキーボードがオフに切り替えられたときにのみ生成されます。

0
Claytog

私にとってこのエラーは、tableView.estimatedRowHeight = UITableViewAutomaticDimension

これはtableView.estimatedRowHeight = "Some hardcoded value"

0
Ali