Auto Layout의 잘못된 해석교통이 편리하다
5394 단어 AutoLayoutiOS
무슨 공구요?
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
보태다
모든 오류를 분석할 수 있느냐 없느냐도 아닌 것 같다.
총결산
하고 싶은 포석.
이런 레이아웃을 만들려고 코드를 쓰면서 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
보태다
모든 오류를 분석할 수 있느냐 없느냐도 아닌 것 같다.
총결산
Reference
이 문제에 관하여(Auto Layout의 잘못된 해석교통이 편리하다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/akatsuki174/items/ccf394c03677ac62191e텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)