✔︎ 오늘의 정리
- UISearchBar / tableView 사용 시 탭 제스쳐 이용해서 키보드 내리는 법
- SearchBar 취소 버튼 구현
- CollectionView의 header를 구현할 때는 reusableView를 사용함
SearchBar 취소 버튼 구현

민둥한 서치바 옆에 취소 버튼을 구현해 주고 싶었다.
placeholder에 단어도 넣어주고!
searchBar.placeholder = "검색어를 입력하세요"
searchBar.setValue("취소", forKey: "cancelButtonText")
searchBar.setShowsCancelButton(true, animated: true)

결과: 굿
UISearchBar / tableView 사용 시 탭 제스쳐 이용해서 키보드 내리는 법
서치바를 넣는 바람에 키보드 내려야 해서 암 생각 없이 탭 제스쳐를 넣었는데 안 먹드라
사실 당연하다... 원래 테이블뷰에서 스크롤하면 키보드가 내려가니까
근데 왜 뷰컨 안에 있는 테이블뷰에서는 스크롤해도 안 내려갈까?
찾아보니 이유는 간단했다.
스크롤뷰를 상속받고 있으면 드래그하면 자동으루 내려가야 하는 거 아냐? 했는데
당근 설정해 줘야 했다.
그래 테이블뷰는 죄가없다
문제는나엿다
tableView.keyboardDismissMode = .onDrag
요 코드를 넣어주면 테이블뷰 안에서 내려줄 수 있다.
아마 인스펙터영역 안에서도 설정해 줄 수 있는듯?!
그치만! 나는 테이블뷰 안에서 드래그를 통해서 내려주는 게 아니라 탭 제스쳐로 화면을 터치했을 때 키보드를 내려주고 싶었다.
override func viewDidLoad() {
super.viewDidLoad()
title = "검색"
addLeftBarItem()
searchBar.delegate = self
searchTableView.dataSource = self
searchTableView.delegate = self
let nib = UINib(nibName: "SearchTableViewCell", bundle: nil)
searchTableView.register(nib, forCellReuseIdentifier: "SearchTableViewCell")
let tap = UITapGestureRecognizer(target: self, action: #selector(endEditing))
view.isUserInteractionEnabled = true // 없으면 동장하지 않음
view.addGestureRecognizer(tap)
designSearchBar()
}
@objc func endEditing() {
self.view.endEditing(true)
}
이렇게!
근데 구현이 안 됐음
아니 안 됐다기보다는 너무 잘 먹어서 문제였다.
검색해서 상세 페이지를 볼 수 있도록 구현했는데 키보드만 잘 내려가고 상세 페이지가 잘 눌리지 않았다 ^_^ ,,
찾아보니 searchBar에서 키보드 같은 검색 관련 이벤트들을 뷰 대신 처리해서 그런 것 같았다.
위에서 타겟을 뷰로 설정한 뒤에 탭 제스쳐가 일어난다고 했는데,
override func viewDidLoad() {
super.viewDidLoad()
title = "검색"
addLeftBarItem()
searchBar.delegate = self
searchTableView.dataSource = self
searchTableView.delegate = self
let nib = UINib(nibName: "SearchTableViewCell", bundle: nil)
searchTableView.register(nib, forCellReuseIdentifier: "SearchTableViewCell")
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(endEditing))
tapGesture.cancelsTouchesInView = false
view.addGestureRecognizer(tapGesture)
designSearchBar()
}
@objc func endEditing() {
searchBar.endEditing(true)
}
서치바를 타겟으로 바꾸어 탭 제스쳐를 적용해 주니 말끔하게 해결됐다.

ㅠㅠ 감격스럽다...........................................................
더욱 다양한 방법은 요 아래 블로그에서!
https://ios-daniel-yang.tistory.com/104
[Swift/ TIL #28] KeyBoard 내리는 방법들 (터치, 드래그 등)
[TIL #28] 2023 / 06 / 10 키보는 내리는 방법들을 소개하겠습니다. touchesBegan 사용 touchesBegan은 새로운 터치가 입력될 때, 호출되는 메서드입니다. View 같은 곳에서 그냥 간편하게 사용할 수 있는 방법
ios-daniel-yang.tistory.com
https://effectivecode.tistory.com/1585
UITableView, UITextfield Keyboard 내리는 방법 2가지.
사실, 흔하디 흔한 내용의 글이다. 새로 프로젝트를 진행하면서 Swift로 개발을 또 하게 되었고 사용할 때마다 새삼 좋다는 느낌을 받고 있다. 오늘은 어제 UI작업을 하면서 사용했던 코드 몇 가지
effectivecode.tistory.com
CollectionView의 header를 구현할 때는 reusableView를 사용함
그렇다고 한다.
tableView에서 헤더를 적용할 때는 그냥 뷰를 갖다 붙이면 위에 쏙 달라붙었는데 콜렉션뷰는 아무리 갖다대도 안 붙길래 뭐지? 했다.
알고 보니 아예 붙는 뷰가 달랐음.
구현해 보고 싶어서 댐볏다가...
// 아니 이거 왜 안 댐?????
override func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) ->
UICollectionReusableView {
print("hi")
switch kind {
case UICollectionView.elementKindSectionHeader:
// 2
let headerView = collectionView.dequeueReusableSupplementaryView(
ofKind: kind,
withReuseIdentifier: "\(SearchCollectionReusableView.self)",
for: indexPath)
// 3
guard let typedHeaderView = headerView as? SearchCollectionReusableView
else { return headerView }
typedHeaderView.searchBar.placeholder = "단어를 입력하세요!"
return typedHeaderView
default:
// 5
assert(false, "Invalid element type")
}
}
걍 피만 봤다.
낼 다시 도전할 거임 ㅡㅡ
이 친구를 사용한다는 것만 알고 이런 식으로 사용하면 대는구나......!!! 는 대강 감이 잡혔는데
막상 적용은 안 돼서 너무 화난다
뭐가문제지?????
하...
일단 과제는 해야 하니까 다른 서치 페이지를 만들어서 따로 구현했는데
넘 화난다
누가이기나보자
낼 또 뿌시러 옴 ㅡㅡ
헐 ㅋㅋ 어제 다 써 놓고 안 올리고 잤다
'TIL' 카테고리의 다른 글
[SeSAC] August 7, 2023 (0) | 2023.08.07 |
---|---|
[SeSAC] August 6, 2023 (0) | 2023.08.07 |
[SeSAC] August 2, 2023 (0) | 2023.08.02 |
[SeSAC] August 1, 2023 (0) | 2023.08.01 |
[SeSAC] July 31, 2023 (0) | 2023.08.01 |