AutoLayoutのエラーを紐解くときにやっていること
以前ふとこんなツイートをしたところ意外とLikeされた。
AutoLayoutのエラーがコンソールに出た時意味不明だけどviewのaccesibilityIdentifierとconstraintのidentifierに任意の文字列入れておくとメモリアドレスの部分がそれに置き換わるのでおすすめ
— 🙌🐼ひらり🐼🙌 (@hiragram) 2017年6月8日
AutoLayoutの制約に矛盾があるときにコンソールにでるメッセージ
これをみて直さないといけないときに自分がやっていることをまとめておく。
ビューのaccessibilityIdentifier
を設定する
コードからならhogeView.accessibilityIdentifier
xib/storyboardならここ。
すると
UIView:0xXXXXXXXXXXXX
と出てたところがaccessibilityIdentifier
に置き換わる。
制約のidentifier
を設定する
コードからならconstraint.identifier
xib/storyboardなら制約を選択してここ。
すると
アドレスを指定してビューに背景色をつけたりする
コンフリした制約が多すぎてidentifierつけるのがだるいときとかはlldb上でアドレスを指定してUIViewのインスタンスをとってきてbackgroundColor
で色を変える。
エラーでる画面のviewDidAppear
とかでブレークして、
(lldb) e let $v = unsafeBitCast(0x7fc85dd0a0f0, to: UIView.self) (lldb) e $v.backgroundColor = UIColor.yellow
でブレークを解除して動かすとアプリ上で色が変わる。隠れてたら階層見るアレで見て。
NSLayoutConstraintのアドレスを渡すと対象のビューに枠線をつけるlldbプラグインを作った
Python初めて書いたので許して
#!/usr/bin/python import lldb def process(debugger, command, result, internal_dict): lldb.debugger.HandleCommand(""" expr -l swift -- func $process(_ address: Int) { let constraint = unsafeBitCast(address, to: NSLayoutConstraint.self) guard let view1 = constraint.firstItem as? UIView else { return } view1.layer.borderColor = UIColor.red.cgColor view1.layer.borderWidth = 2 guard let view2 = constraint.secondItem as? UIView else { return } view2.layer.borderColor = UIColor.blue.cgColor view2.layer.borderWidth = 2 } """.strip()) lldb.debugger.HandleCommand('expr -l swift -- $process('+command+')') def __lldb_init_module(debugger, internal_dict): debugger.HandleCommand("command script add -f visualizeAutoLayoutTargets.process visualizeAutoLayoutTargets") print "enabled visualizeAutoLayoutTargets command."
導入とか使い方はこの辺を参考にしたのでそっちを見てください
使った感じはこんな感じ
AutoLayoutのエラーからNSLayoutConstraintのアドレス拾って渡すと対象のビューに赤と青の枠つけてくれるlldbプラグインできた pic.twitter.com/1KZZ1I03CH
— 🙌🐼ひらり🐼🙌 (@hiragram) 2017年6月10日
これは記事頭のツイートがちょっと盛り上がってからふーんと思って作ったものなので実務から生まれたものではないです。使いづらいとか知らない。
おわり