Danny의 iOS 컨닝페이퍼
article thumbnail

[TIL #28] 2023 / 06 / 10

키보는 내리는 방법들을 소개하겠습니다.

 

 

touchesBegan 사용

touchesBegan은 새로운 터치가 입력될 때, 호출되는 메서드입니다.

View 같은 곳에서 그냥 간편하게 사용할 수 있는 방법입니다.

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    self.view.endEditing(true)
}

 

아래 메서드로도 키보드를 닫을 수 있습니다.

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    view.resignFirstResponder()
}

 

UITapGestureRecognizer 사용

UITapGestureRecognizer은 사용자의 동작을 감지하여, 설정한 동작이 발생하면 action을 실행해 줄 수 있습니다.

 

아래 코드는 현재 view에 UITapGestureRecognizer를 추가해 준 겁니다.

view의 모든 영역을 클릭할 때, tapHandler가 동작하게 됩니다. 

func hideKeyBoardWhenTappedScreen() {
    let tapGesture = UITapGestureRecognizer(target: self, action: #selector(tapHandler))
    // 터치 시, 현재 뷰의 터치를 취소합니다. 기본값은 true이며, 상호작용이 필요하면 false로 처리
    tapGesture.cancelsTouchesInView = false
    view.addGestureRecognizer(tapGesture)
}

@objc func tapHandler() {
    self.view.endEditing(true)
}
@objc func tapHandler() {
    view.resignFirstResponder()
}

UITapGestureRecognizer 대한 자세한 소개는 나중에 기회가 되면 올리겠습니다. 

 

 

UIScrollView를 상속받고 있다면

UITableView, UICollectionView 등, 이런 친구들은 기본적으로 스크롤 기능이 있습니다.

즉, UIScrollView를 상속받고 있겠죠?

 

UIScrollView는 특별하게도 키보드 닫기 관련 프로퍼티인 keyboardDismissMode가 있습니다.

 

여기서 키보드를 해재 할 방법을 선택할 수 있는데요.

keyboardDismissMode의 여러 상수 중, onDrag를 사용해 주면 됩니다.

 

간단하게 기능을 설명하면 테이블 뷰를 드래그할 때, 키보드가 자동으로 해제되게 만들어주는 기능입니다.

 

위의 예제랑 동작 방식이 조금 다르긴 하지만, 이 방법으로도 간단하게 키보드를 닫을 수 있습니다.

 

자 간단히 테이블 뷰에서 사용하는 방법을 봅시다. (끝...)

// 드래그 시, 키보드를 닫는다.
tableView.keyboardDismissMode = .onDrag

 

 

UISearchController 사용 시 ⭐️

이상하게도 UISearchController를 사용할 땐, view로 접근하여 endEditing을 사용하면 동작을 안 하더라고요.

 

아마도 UISearchController의 searchBar에서 검색 관련 이벤트들(키보드 등)을 view 대신 처리해서 그런 것 같아 보입니다.

 

그래서 그런지 UISearchController를 사용할 때는

view로 접근하는 것이 아니라 searchBar로 접근해서 사용이 끝났다는 걸 알려줘야 합니다.

func hideKeyBoardWhenTappedScreen() {
    let tapGesture = UITapGestureRecognizer(target: self, action: #selector(tapHandler))
    // 터치 시, 현재 뷰의 터치를 취소합니다. 기본값은 true이며, 상호작용이 필요하면 false로 처리
    tapGesture.cancelsTouchesInView = false
    view.addGestureRecognizer(tapGesture)
}

@objc func tapHandler() {
    searchController.searchBar.endEditing(true)
}

 

 

 

 

반응형
profile

Danny의 iOS 컨닝페이퍼

@Danny's iOS

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!