Auto Layout의 잘못된 해석교통이 편리하다

5394 단어 AutoLayoutiOS
iOS 엔지니어라면 Auto Layout을 제대로 설정하지 못하는 제약으로 콘솔에서 하나둘씩 오류가 발생할 수 있다.나란히 커닝하는 거 보고 싶지 않아요. - 이런 기분이 조금 덜할 수 있는 도구, WTF?(Why The Failure, Auto Layout?)소개해 드리려고요.

무슨 공구요?


Auto Layout에 작업 로그가 나타날 때 제약된 충돌을 시각화하는 도구입니다.코드는 GiitHub에서 공개됩니다.
다음은 구체적인 예로 설명한다.

사용 예


하고 싶은 포석.


이런 레이아웃을 만들려고 코드를 쓰면서 Auto Layou를 사용해서 썼어요.self.뷰 위에 회색 뷰를 올리고 UIlabel 레이아웃을 올립니다.UIlabel은 좌우 중앙, 너비는 self입니다.뷰의 0.85를 제약하기 위해서

경고 로그


그런데 왜 그림을 못 그렸는지 경고 일지가 나온다.
[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. 
    (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) 
(
    "<NSAutoresizingMaskLayoutConstraint:0x60800009c2a0 h=--& v=--& UILabel:0x7fc150013250'\U30b7\U30e3\U30a4\U30cb\U30f3\U30b0\n\U30de\U30f3\U30c7\U3047\U3047\U3047\U3047'.width == 0   (active)>",
    "<NSLayoutConstraint:0x60c000280230 UILabel:0x7fc150013250'\U30b7\U30e3\U30a4\U30cb\U30f3\U30b0\n\U30de\U30f3\U30c7\U3047\U3047\U3047\U3047'.width == 0.85*UIView:0x7fc14de15fd0.width   (active)>",
    "<NSLayoutConstraint:0x60c000280d70 'UIView-Encapsulated-Layout-Width' UIView:0x7fc14de15fd0.width == 320   (active)>"
)
Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x604000282ad0 'UIView-Encapsulated-Layout-Width' superView.width == 320   (active, names: superView:0x7f9ed14073d0 )>

Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful.

WTF?구문을 사용합니다.


나는 여기서 이번 공구를 좀 쓰고 싶다.첫 페이지는 이렇습니다.

여기 기술한 대로 방금 작업일지()에 둘러싸인 부분을 붙여주세요.버튼을 누르면...

이렇게 시각적으로 보이다.하지만 아직 이해하기 어려울 것 같다.그래서 이번에view에identifier를 넣어서 더 쉬워 보입니다.다음 행을 추가합니다.
self.view.accessibilityIdentifier = "superView"
coverView.accessibilityIdentifier = "coverView"
messageLabel.accessibilityIdentifier = "messageLabel"
Storyboard에 레이아웃을 그리면 Xcode의 오른쪽 창에서 Access sibility의 Identifier를 선택하여 설정합니다.

이 상태에서 WTF를 한 번 더 해볼까요?에 경고가 입력되어 있으면...

아주 보기 쉬워졌어요.

해석을 해보도록 하겠습니다.


첫 번째 제한으로 보아 안 될 것 같다.메시지 레이블의 width는 0입니다.

마지막에 주석의 * 자국이 붙어 있기 때문에 주석을 보겠습니다.

그는 "만약 이 제한이 의도적이지 않다면 translatesAutoresizingMaskIntoConstraints 를 가짜로 해라."라고 말했다.자체 코드에 생성된view를 Auto Layout에 적용할 때 이를 가짜로 만들어야 한다는 사실을 잊어버린 것 같습니다.
따라서 아래의 코드를 더하면 오류를 없앨 수 있다.
coverView.translatesAutoresizingMaskIntoConstraints = false
messageLabel.translatesAutoresizingMaskIntoConstraints = false

보태다


모든 오류를 분석할 수 있느냐 없느냐도 아닌 것 같다.

총결산

  • 어떤 제약이 얽혀 있는지 확인하려면 why The Failure, Auto Layout?사용하기 편하다
  • 가identifier가 더 쉽게 알 수 있음
  • 좋은 웹페이지 즐겨찾기