뷰에 애니메이션을 주기 위해 원하는 UIView의 너비를 시간이 지남에 따라 줄어들도록 구현하고 있었는데
스냅킷의 제약조건에 관한 크래시가 발생했다.
Updated constraint could not find existing matching constraint to update
다음과 같은 크래시가 나는 걸 확인했다.
초기 UIView의 제약조건은 다음과 같이 설정했다.
progressBar.snp.makeConstraints {
$0.top.leading.bottom.equalToSuperview()
$0.width.equalToSuperview()
}
▶ 뷰의 너비를 equalToSuperview()로 설정
private func updateProgressBar() {
let totalWidth = view.frame.width
let remainingTime = CGFloat(selectedTime)
let initialTime = totalTime // 초기 시간
let progressWidth = totalWidth * remainingTime / CGFloat(initialTime)
progressBar.snp.updateConstraints {
$0.width.equalTo(progressWidth)
}
}
이후 시간이 지남에 따라 뷰의 너비가 수정되도록
다음과 같이 스냅킷의 updateConstraints를 사용했다.
알고보니 여기서 문제는 스냅킷(SnapKit)의 updateConstraints 메서드를 올바르게 사용하지 않아 발생한 것이었다.
updateConstraints 메서드는 초기에 makeConstraints로 설정된 제약조건을 수정하고 업데이트할 때 사용된다.
내가 초기 설정에 사용한 제약조건은 width를 equalToSuperview()로 설정했다.
이는 progressBar의 너비를 부모 뷰(Superview)의 너비와 동일하게 만드는 제약 조건이다!
일반적으로 뷰의 크기가 부모 뷰와 같거나 비교 대상이 되는 뷰에 맞추는 경우가 많은데,
이렇게 할 경우 이후에 비교 대상에 대해 updateConstraints만으로는 제약 조건을 변경할 수 없는 문제가 발생할 수 있다.
progressBar.snp.makeConstraints {
$0.top.leading.bottom.equalToSuperview()
$0.width.equalTo(UIScreen.main.bounds.size.width)
}
그래서 원래는 SuperView와 동일한 너비를 사용해서 제약조건을 설정했지만
디바이스의 너비로 수정하여 (비교 대상 있는 너비 대신 고정된 너비를 사용) 초기 설정을 바꾸면서 updateConstraints 문제를 해결했다.
'Devlog👩🏻💻 > iOS' 카테고리의 다른 글
[iOS] CollectionView 페이징 (Pagination), LoadMore (0) | 2024.06.29 |
---|---|
[Error/Xcode] 시뮬레이터 SearchBar & TextField 키보드 오류 (4) | 2024.05.07 |
[iOS/Xcode] CodeBase & SnapKit 연습하기, Storyboard 삭제 세팅 (2) | 2024.05.04 |
[iOS] Content Hugging Priority와 Content Compression Resistance Priority (4) | 2024.05.03 |
[iOS] 동기 vs 비동기, Serial vs Concurrent 이해하기 (8) | 2024.05.02 |