티스토리 뷰

반응형



UIKit으로 View를 구성할때 뿐만 아니라 SwiftUI를 사용할때도 키보드가 올라오거나 내려가는 등의 이벤트가 발생했을때를 감지해서 뷰의 상태를 변화시키고 싶을때가 있을텐데요.
오늘은 Combine framework에서 제공하는 Combine framework, Publisher를 사용해서 SwiftUI View 에서 공통적으로, 혹은 개별적으로 키보드 이벤트를 처리하는 방법을 알아보겠습니다.


SwiftUI View에서 키보드 show, hide 이벤트 처리하는 프로토콜, Publisher 구현하기
KeyboardReadable protocol 구현

먼저 키보드 이벤트를 감지할 View에 채택해서 사용할 프로토콜을 구현하겠습니다. Combine framework에서 사용할 Publisher 뿐만 아니라 키보드 이벤트 감지를 위해 UIResponder도 사용할 예정이기에 UIKit, Combine 두개를 import 시켜줍니다.
KeyboardReadable에는 keyboardEventPublisher를 읽기 전용으로 정의했습니다. Bool 이벤트 값을 방출하고, 에러는 방출하지 않는 AnyPublisher<Bool, Never> 타입입니다.

KeyboardReadable protocol의 extension을 구현해보겠습니다. 읽기전용 계산프로퍼티 방식으로 publisher를 구현합니다.
20행) Publishers는 Combine에서 사용 가능한 Publisher 프로토콜을 채택한 Publisher 연산자들이 정의된 Enum 타입입니다. 여기에서 Merge 연산자를 통해 두개의 publisher 이벤트를 merge 하겠습니다.
22 ~ 27행) publisher(for:)는 Notification.Name타입을 인자로 받아서, 그에 맞는 NotificationCenter.Publisher를 반환합니다. 이어서 map 연산자를 사용하면서 Notification 값이 downstream으로 내려오는데, 현재 우리는 키보드가 올라갔는지, 내려갔는지 여부만 알면 되기에, 올라갔을때(keyboardWillShowNotification)에는 true를, 그 반대(keyboardWillHideNotification)의 경우에는 false로 맵핑을 하고 내려줍니다.
28행) 마지막 결과값은 eraseToAnyPublisher()를 사용하여 지금까지의 연산결과를 AnyPublisher<Bool, Never> 타입으로 반환합니다.
이제 keyboardWillShow, keyboardWillHide 이벤트 발생 시, 발생하는 이벤트 성격에 따라 true / false 이벤트 값을 방출하는 Publisher를 KeyboardReadable 프로토콜에 구현했습니다. 이제 SwiftUI View에 해당 프로토콜을 채택해서 이벤트를 처리해보겠습니다.


키보드 이벤트 감지를 원하는 SwiftUI View에 KeyboardReadable protocol 채택해서 사용방법

일부 하위 뷰에서만 키보드 이벤트를 감지하고 싶다면 해당 뷰에 한해서 KeyboardReadable를 채택하시고, 공통 이벤트처럼 감지하고 싶다면, 상위 계층의 뷰에 프로토콜을 채택해서 사용하시면 됩니다.
저같은 경우는 메인뷰에 KeyboardReadable 프로토콜을 채택해서 이벤트를 감지해보겠습니다.

뷰 하단, Publisher를 인자로 받는 .onReceive 메서드를 사용해줍니다. 해당 메서드에 인자로 keyboardEventPublisher를 인자로 넣으면, perform 클로져 내에서 키보드가 올라올때는 true / 내려갈때는 false 값을 받아서 키보드 상태에 따른 처리를 할 수 있게 됩니다. 저같은 경우는 키보드 이벤트에 따라 하단 커스텀 탭바를 숨기거나 가리도록 코드를 구현해봤습니다. 클로져 내에 본인이 원하시는 코드 작성하시면 될 것 같습니다.


지금까지 키보드 이벤트를 방출하는 Publisher가 있는 protocol을 구현 후 SwiftUI View에 프로토콜을 채택, 활용해서 SwiftUI View에서 keyboardWillShow, keyboardWillHide 이벤트를 감지하는 방법을 알아보았습니다.
본 포스팅에서는 keyboardWillShow, keyboardWillHide 두개의 이벤트만 활용을 했지만 본인 필요에 따라 다른 다양한 이벤트를 처리하실 수 있을거라 생각합니다. 키보드 이벤트가 꼭 아니어도 되구요. 관련 의견이나 질문은 언제든 댓글 달아주시면 감사하겠습니다. 즐거운 코딩 되세요!

반응형
댓글
반응형
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함