본문 바로가기

iOS

[iOS] Unable to activate constraint with anchors Error

개요

SnapKit을 통해 코드로 레이아웃을 만들고 있다가 오류를 만났습니다.

레이아웃을 잡으면 발생하는 오류이고, 레이아웃을 잡지 않으면 오류가 발생하지 않았습니다.

에러의 원인은 레이아웃이라고 생각했습니다.

 

 

에러 본문

 

Thread 1: "Unable to activate constraint with anchors <NSLayoutYAxisAnchor:0x6000017f0380 \"OpenMarket.ItemCollectionView:0x14c819e00.top\"> and <NSLayoutYAxisAnchor:0x6000017cfe00 \"UILayoutGuide:0x600003b94c40'UIViewSafeAreaLayoutGuide'.top\"> because they have no common ancestor.  Does the constraint or its anchors reference items in different view hierarchies?  That's illegal."

 

 

 

에러 해석 (번역기)

쓰레드 1 : "앵커로 구속을 활성화할 수 없음"Anchor : 0x6000017f0380 "OpenMarket.ItemCollectionView : 0x14c819e00.top" "NSLayoutYAxisAnchor : 0x6000017cfe00"UILayoutGuide : 0x60000000 3b94c40'UIViewSafeAreaLayoutGuide'.top"> 공통 조상이 없기 때문이다. 제약 조건 또는 그 앵커는 다른 계층에서 항목을 참조하는가? 그건 불법이야."

 

 

 

에러가 발생한 코드 구성

private func configureCollectionView() {
        collectionView.register(ItemCollectionViewCell.self,
                                forCellWithReuseIdentifier: ItemCollectionViewCell.identifier)
        collectionView.translatesAutoresizingMaskIntoConstraints = false
        collectionView.backgroundColor = .white
        
        collectionView.snp.makeConstraints { view in
            view.top.equalTo(self.view.safeAreaLayoutGuide)
            view.bottom.equalTo(self.view.safeAreaLayoutGuide)
            view.leading.equalTo(self.view.safeAreaLayoutGuide)
            view.trailing.equalTo(self.view.safeAreaLayoutGuide)
        }

        view.addSubview(collectionView)
    }

 

해결 방법

원인은 collectionView가 상위 계층의 view의 접근 권한이 없기 때문입니다.

 

addSubView는 상위 뷰와 하위 뷰를 연결시키고 접근 권한을 주는 메서드입니다. 

 

에러가 발생한 코드 구성을 보면 view에 addSubView 메서드가 레이아웃을 잡는 코드 뒤에 호출됐습니다.

 

권한이 없는데 상위 뷰에게 접근하여 제약 조건을 걸려고 했기 때문에 불법이라고 오류가 난 것입니다.

 

해결 방법은 서로의 호출 순서를 바꾸면 됩니다.

 

private func configureCollectionView() {
        collectionView.register(ItemCollectionViewCell.self,
                                forCellWithReuseIdentifier: ItemCollectionViewCell.identifier)
        collectionView.translatesAutoresizingMaskIntoConstraints = false
        collectionView.backgroundColor = .white

        view.addSubview(collectionView)
        
        collectionView.snp.makeConstraints { view in
            view.top.equalTo(self.view.safeAreaLayoutGuide)
            view.bottom.equalTo(self.view.safeAreaLayoutGuide)
            view.leading.equalTo(self.view.safeAreaLayoutGuide)
            view.trailing.equalTo(self.view.safeAreaLayoutGuide)
        }
    }