hiragram no blog

iOSとか

AutoLayoutのエラーを紐解くときにやっていること

以前ふとこんなツイートをしたところ意外とLikeされた。

AutoLayoutの制約に矛盾があるときにコンソールにでるメッセージ

f:id:hiragram:20170611004037p:plain

これをみて直さないといけないときに自分がやっていることをまとめておく。

ビューのaccessibilityIdentifierを設定する

コードからならhogeView.accessibilityIdentifier

xib/storyboardならここ。

f:id:hiragram:20170611004958p:plain

すると

f:id:hiragram:20170611005235p:plain

UIView:0xXXXXXXXXXXXXと出てたところがaccessibilityIdentifierに置き換わる。

制約のidentifierを設定する

コードからならconstraint.identifier

xib/storyboardなら制約を選択してここ。

f:id:hiragram:20170611005813p:plain

すると

f:id:hiragram:20170611005858p:plain

アドレスを指定してビューに背景色をつけたりする

コンフリした制約が多すぎて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."

導入とか使い方はこの辺を参考にしたのでそっちを見てください

iOSエンジニアのための LLDB Plugin 入門

使った感じはこんな感じ

これは記事頭のツイートがちょっと盛り上がってからふーんと思って作ったものなので実務から生まれたものではないです。使いづらいとか知らない。

おわり