[swift] IGListDiffKit과 함께하는 키보드 처리

IGListDiffKit은 iOS 앱의 컬렉션 뷰에서 데이터 변경을 감지하고 효율적인 업데이트를 수행하는 데 도움이되는 오픈 소스 라이브러리입니다. 이번 블로그에서는 IGListDiffKit을 사용하여 키보드 처리를 구현하는 방법에 대해 알아보겠습니다.

1. 키보드 상태 감지하기

키보드의 나타나거나 사라지는 이벤트를 감지하기 위해 NotificationCenter를 사용할 수 있습니다. 다음은 키보드 상태를 감지하는 코드 예시입니다.

NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow(notification:)), 
    name: UIResponder.keyboardWillShowNotification, object: nil)

NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide(notification:)), 
    name: UIResponder.keyboardWillHideNotification, object: nil)

2. 키보드 높이 구하기

키보드의 높이를 구하기 위해서는 키보드가 표시 될 때의 뷰의 크기를 확인해야합니다. 다음은 키보드가 나타날 때 호출되는 메서드의 예시입니다.

@objc private func keyboardWillShow(notification: Notification) {
    if let keyboardFrame = notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? CGRect {
        let keyboardHeight = keyboardFrame.height
        // 키보드 높이를 사용하여 뷰의 업데이트 작업 수행
    }
}

3. 아이템 업데이트하기

IGListDiffKit을 사용하여 컬렉션 뷰의 아이템을 업데이트하는 것은 간단합니다. IGListDiffable 프로토콜을 구현하여 각 아이템의 변경 사항을 추적하고 업데이트할 수 있습니다. 예를 들면 다음과 같습니다.

class Item: NSObject, IGListDiffable {
    let identifier: String
    
    init(identifier: String) {
        self.identifier = identifier
    }
    
    func diffIdentifier() -> NSObjectProtocol {
        return identifier as NSObjectProtocol
    }
    
    func isEqual(toDiffableObject object: IGListDiffable?) -> Bool {
        guard let object = object as? Item else { return false }
        return identifier == object.identifier
    }
}

4. 키보드 처리 예시

이제 IGListDiffKit과 키보드 처리를 조합하여 예시를 구현해 보겠습니다. 예를 들어, 키보드가 나타날 때 새로운 아이템을 추가하고, 키보드가 사라질 때 업데이트된 아이템을 컬렉션 뷰에 반영하는 것입니다.

@objc private func keyboardWillShow(notification: Notification) {
    if let keyboardFrame = notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? CGRect {
        let keyboardHeight = keyboardFrame.height
        let newItem = Item(identifier: "New Item")
        
        // 아이템 추가
        // ...

        // 컬렉션 뷰 업데이트
        collectionView.reloadData()
    }
}

@objc private func keyboardWillHide(notification: Notification) {
    let updatedItem = Item(identifier: "Updated Item")
    
    // 아이템 업데이트
    // ...
    
    // 컬렉션 뷰 업데이트
    collectionView.reloadData()
}

위의 코드 예시에서는 키보드 상태를 감지하고, 새로운 아이템을 추가하거나 업데이트 한 후, 컬렉션 뷰를 업데이트하여 변경 사항을 반영합니다.

이제 IGListDiffKit과 함께 하는 키보드 처리에 대해 알아보았습니다. IGListDiffKit을 사용하면 컬렉션 뷰의 데이터 업데이트를 효율적으로 수행할 수 있으며, 키보드 처리를 비롯한 다양한 UI 업데이트 작업에 유용하게 사용할 수 있습니다.

참고 자료