iOS AutoLayout의 디버깅 기술 (Xcode 7에서 도입 된 ID 등)

앞서 주당, 이 2건의 AutoLayout의 디버그 테크닉계 기사가 해외에서 화제가 되고 있어 포켓 로 쌓아 올려 상태가 되어 있었기 때문에, 파내면서 시험해 보았습니다.
  • Using Identifiers to Debug Autolayout - Use Your Loaf
  • Autolayout breakpoints - NSHint

  • UIViewAlertForUnsatisfiableConstraints의 심볼릭 브레이크 포인트 설정



    이 브레이크 포인트를 설정하면 말 그대로 AutoLayout의 제약 불일치가 발생했을 때 브레이크 해줍니다.

    게다가 Action 도 설정하는 것이 간이고, 이 경우는 다음의 설정을 하면 브레이크시에 보기 쉬운 로그가 자동 출력되게 됩니다.
    관련 : Objective-C - Xcode에서 디버깅이 실행되는 동안 충돌이 발생했을 때 중단되는 중단 점 설정 - Qiita
  • Objective-C : po [[UIWindow keyWindow] _autolayoutTrace]
  • Swift : expr -l objc++ -O -- [[UIWindow keyWindow] _autolayoutTrace]



  • 추악한 로그( ´・‿・`)



    다만, 화면 천이 후의 순간에 천이 후의 화면에서 제약 모순이 발생했을 경우, 로그에 나오는 레이아웃 정보가 이전의 화면에서 미묘하게 도움이 되지 않았다고 하는 문제도 있었습니다(´・ω・`)

    그리고, 전 기사에는 쓰고 있지 않습니다만, 브레이크 한 상태로, Xcode의 View UI Hierarchy 를 실행하면, 아마 좋은 느낌에 그 화면 상태를 표시해 줄 것입니다.



    최근, Xcode의 상태가 나빠서, 이런 조작하면 크래쉬 해 버려, 나는 제대로 볼 수 있는지 확인 할 수 없었습니다만(´・ω・`)

    제약에 이름 지정(Xcode 7~)



    WWDC의 발표에 포함되어 있었던 것 같습니다만 Xcode 7에서는 이런 식으로, 제약은 Identifier 라는 프로퍼티가 있어, 그것을 설정하는 것으로 로그에 제약명이 나오게 되는 것 같습니다.



    코드의 경우는 이렇네요.
    constraint.identifier = "$GemeInfoBottom$"
    

    확실히 로그에 이름이 나왔습니다. 알기 쉽다( ´・‿・`)
    2015-08-31 09:59:13.223 Player[80154:6146881] 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:0x7f8a42dd76c0 V:[UIImageView:0x7f8a4517b0c0(44)]>",
        "<NSLayoutConstraint:0x7f8a42d1e110 UITableViewCellContentView:0x7f8a42decfd0.centerY == UIImageView:0x7f8a4517b0c0.centerY>",
        "<NSLayoutConstraint:0x7f8a4514a2b0 '$GemeInfoBottom$' V:[UIImageView:0x7f8a4517b0c0]-(>=8)-|   (Names: '|':UITableViewCellContentView:0x7f8a42decfd0 )>",
        "<NSLayoutConstraint:0x7f8a453047f0 'UIView-Encapsulated-Layout-Height' V:[UITableViewCellContentView:0x7f8a42decfd0(59.5)]>"
    )
    

    전 제약에 미리 붙여 두면 뒤틀릴 것 같지만, 꽤 번거롭지 않네요(´・ω・`)

    좋은 웹페이지 즐겨찾기