UIStackView 내 view가 표시되지 않으면 AutoLayout 경고

쓰고 계신가요?


UIStackView 하면 안드로이드에서 말하는 링크어Layout 같은 것이지만 개인적으로는 사용하기 어려워 어쩔 수 없다.
세계에서 iOS 앱을 개발한 사람은 업무에서도 사용한 적이 있습니까?
도저히 겨냥한 디자인이 안 돼서 시간이 많이 걸릴 것 같았는데 사용법을 잘 몰라서 그런가.(솔직히 나는 swift도 업무에서 사용하는지 반신반의한다.)
UIStack View 내의 뷰가 숨겨져 있기 때문에 Android의 View를 원망해 왔습니다.GONE처럼 뷰 부분의 레이아웃을 촘촘하게 표시할 수 있다는 점에서 편리할 수도 있다.

투덜거리지 말고 좀 써봐라


습관을 갖기 위해 다양한 일을 시도해 보았지만 다음과 같은 패턴에 경고가 쏟아졌기 때문에 그 해결책이다.

그리 대단한 레이아웃은 아니지만 UIImageView와 UIStackView가 있습니다.
또한 UIStackView에는 3개의 UIlabel이 있습니다.
나는 이것이 흔히 볼 수 있는 포석이라고 생각한다.
 
UIImageView는 너비와 너비의 제한이 있습니다.
이 상태에서 실행하면 특별한 경고 없이 정상적으로 표시됩니다.

view.YES로 경고 보내기


다음은 코드로 다음과 같이 시도해 봅시다.
- (void)viewDidLoad {
    [super viewDidLoad];
    self.imageView.hidden = YES;
}
예, 왼쪽 UIImageView는 시작할 때 숨겨집니다.
그림이 보이지 않습니다. 탭들은 왼쪽에 표시해야 합니다.
하지만 이것을 하면 대체로 정확하게 표시되며 일지에는 다음과 같은 경고가 나온다.
2017-04-14 22:41:49.655702+0900 StackViewTest[1485:103003] [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. 
(
    "<NSLayoutConstraint:0x608000098f10 UIImageView:0x7fa4b1608aa0.width == 101   (active)>",
    "<NSLayoutConstraint:0x61000009bc60 'UISV-hiding' UIImageView:0x7fa4b1608aa0.width == 0   (active)>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x608000098f10 UIImageView:0x7fa4b1608aa0.width == 101   (active)>

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.
오류를 제한할 때 나타나는 경고다.
그냥 Hidden을 YES로 설정했을 뿐인데 뭐가 문제야.

해결하다


이미지 뷰의 제약을 다음과 같이 일시적으로 경고하지 않습니다.

폭 제한에 대한 Prority는 1000→999로 설정됩니다.
솔직히 이치를 잘 몰라요.
이런 곳에서는 UIStackView를 사용하기 어려울 수 있습니다.
그나저나 이 경고는 UIStackView 내에 뷰가 2개 이상, 왼쪽(Axis는 Vertical인 경우 위쪽)의 뷰에 너비(Axis는 Vertical인 경우 높이)가 있는 경우에만 발생한다.

좋은 웹페이지 즐겨찾기