본문 바로가기

DEV

[iOS/Swift] UIKit 코드베이스 UIView 분리하기 (Unable to simultaneously satisfy constraints...)

반응형

오늘은 기존에 파일 한 곳에 전부 작성된 뷰들을 분리하는데 하루를 보냈다..

 

아래처럼 뷰를 일단 분리하였다.

MVVM을 이용하려고 ViewModel 파일을 임시로 만들었지만, 아직 MVC도 제대로 다룰줄 몰라 튜터님과 상담 후 일단 이번 과제에서는 MVC를 사용하기로 결정했다.

 

이번에 알게됐는데 View를 나누면 각 View 파일에 아래와 같은 코드를 작성해야 한다고 한다.

override init(frame: CGRect) {
    super.init(frame: frame)
        
    configureLayout()
}

required init?(coder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

 

CGRect 부분 init은 View 작성 시 필요한 초기화 구문이고

 

NSCoder 부분은 Storyboard 관련 초기화라고 한다.

Storyboard를 쓰지 않아도 required로 필수 초기화 구문이기에 작성해 주어야 한다.

 

기존에 뷰 관련 코드가 많아서 분리하는데 애를 먹었다.

SnapKit 제약 조건 관해서 오류도 많이 생겼었다.

다행히 튜터님의 도움으로 어찌저찌 해결하긴 했다.

 

아래처럼 View 디버그 모드로 레이아웃 오류들을 확인하며 수정을 했다.

그런데 다시보니 아직 오류가 있었다.

 

 

 

HeaderView의 높이를 명확하게 설정해달라고 한다..

나중에 수정해야겠다.

 

아래 사진처럼

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......

이란 오류가 나올때가 많았다.

 

 

이런 AutoLayout 오류들을 해결할때 아래 사이트가 유용하다고 한다.

https://www.wtfautolayout.com/

 

WTF Auto Layout?

Make sense of cryptic Auto Layout error logs.

www.wtfautolayout.com

 

해당 오류메시지들을 복붙하여 입력하면 아래처럼 오류에 대해 간단히 해석을 해준다.

하지만, 이걸 봐도 도저히 감이 안잡혀서 그냥 Grok한테 물어보니 명쾌하게 답을 알려줬다.

내 코드에 있던 오류들은 대부분 고정 값이 문제였다.

equalTo로 지정했던 고정값들을 greaterThanOrEqualTolessThanOrEqualTo로 적절히 수정하니 해결되었다

반응형