[SeSAC] August 3, 2023

✔︎ 오늘의 정리

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

 


 

SearchBar 취소 버튼 구현

etc-image-0

민둥한 서치바 옆에 취소 버튼을 구현해 주고 싶었다.

placeholder에 단어도 넣어주고!

 

        searchBar.placeholder = "검색어를 입력하세요"
        searchBar.setValue("취소", forKey: "cancelButtonText")
        searchBar.setShowsCancelButton(true, animated: true)

 

etc-image-1

결과: 굿

 

 

 

 

 

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)
    }

서치바를 타겟으로 바꾸어 탭 제스쳐를 적용해 주니 말끔하게 해결됐다.

 

etc-image-2

ㅠㅠ 감격스럽다...........................................................

 

 

 

더욱 다양한 방법은 요 아래 블로그에서!

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