woshidan's loose leaf

ぼんやり勉強しています

\[LayoutConstraints\] Unable to simultaneously satisfy constraints. のログを確認する

コードで NSLayoutConstraint を追加してレイアウトを記述していると、

2017-08-23 20:08:37.967040+0900 TestApp[19312:543735] [LayoutConstraints] 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:0x6100002851e0 UIView:0x7f97bdd3ca40.width == 300   (active)>",
    "<NSLayoutConstraint:0x610000285410 UIView:0x7f97bdd3ca40.left == UILabel:0x7f97bdd3cbe0'labelText'.left   (active)>",
    "<NSLayoutConstraint:0x610000285550 UILabel:0x7f97bdd3cbe0'labelText'.width == 298.2   (active)>",
    "<NSLayoutConstraint:0x6100002855a0 UILabel:0x7f97bdd3cbe0'labelText'.right == UIView:0x7f97bdd3ca40.right   (active)>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x6100002855a0 UILabel:0x7f97bdd3cbe0'labelText'.right == UIView:0x7f97bdd3ca40.right   (active)>

のようなログに会うことがあります。ぶっちゃけこういう形でもらってもわかりにくいんですが、このログの見方のメモ。

  • ログの意味としては加えられた制約を同時に満たすことができなかったので、下記にあげる制約のうち、どれか間違っていないか確認してくれ
  • 制約がどのViewに関するものかわかりにくい点について
    • UILabel に関する部分でログが出ているとき、 UILabel:0x7f97bdd3cbe0'labelText'", のように、ラベルに表示されているテキストが後ろについている
    • それ以外のViewに関しては NSLog(@"%@", view); のようにすると、 <UIView: 0x7fe47dc33e80; frame = (0 0; 0 0); tag = 1; layer = <CALayer: 0x6000000337c0>> のようにオブジェクトのidのようなもの*1がわかるので、それと見比べることで特定しやすい
    • Will attempt to recover by breaking constraint... にある制約を削除するとこの警告は消えるかも

現場からは以上です。

*1:思い出せない。。