ScrollView 삽입에 따른 키보드 컨트롤


보통은 키보드를 내리기 위해 touchBegan을 쓰지만, 스크롤뷰가 추가된 경우 무시되는 경우가 많다.


이러한 경우에 따른 키보드 컨트롤.


1
2
3
4
5
6
7
8
9
10
11
12
// UITextField 컨트롤
        NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide(_:)), name: .UIKeyboardWillShow, object: nil)
        NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow(_:)), name: .UIKeyboardWillHide, object: nil)
        
        // delegate
        sv_scrollView.delegate = self
        
        let singleTapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(tapKeyboardHide))
        singleTapGestureRecognizer.numberOfTapsRequired = 1
        singleTapGestureRecognizer.isEnabled = true
        singleTapGestureRecognizer.cancelsTouchesInView = false
        sv_scrollView.addGestureRecognizer(singleTapGestureRecognizer)
cs


UIScrollView delegate를 연결하는 것과, 싱글탭 제스처를 추가한다.


Observer도 연결해주고..


스크롤뷰의 터치를 한번 하면 키보드를 닫는 코드와, 스크롤뷰를 스크롤 시에 키보드를 내리는 코드가 동시에 적용되어 있다.


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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
// 키보드 보이기 액션
    @objc func keyboardWillShow(_ sender: Notification)
    {
        NSLog("===== ViewController_item keyboardWillShow =====");
 
//        self.view.frame.origin.y = -150 // Move view 150 points upward
        
        // 스크롤뷰에 의한 키보드 컨트롤
        let contentInsets = UIEdgeInsets.zero
        sv_scrollView.contentInset = contentInsets
        sv_scrollView.scrollIndicatorInsets = contentInsets
    }
 
    // 키보드 숨기기
    @objc func keyboardWillHide(_ sender: Notification)
    {
        NSLog("===== ViewController_item keyboardWillHide =====");
 
//        self.view.frame.origin.y = 0 // Move view 150 points upward
        
        // 스크롤뷰에 의한 키보드 컨트롤
        guard let userInfo = sender.userInfo else { return }
        guard var keyboardFrame: CGRect = (userInfo[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue else { return }
        keyboardFrame = self.view.convert(keyboardFrame, from: nil)
        
        var contentInset:UIEdgeInsets = sv_scrollView.contentInset
        contentInset.bottom = keyboardFrame.size.height
        sv_scrollView.contentInset = contentInset
    }
    
    // 엔터로 키보드 내리기
    func textFieldShouldReturn(_ textField: UITextField) -> Bool
    {
        NSLog("===== ViewController_item textFieldShouldReturn =====");
        
        textField.resignFirstResponder()
        return true
    }
    
    // 탭 시 키보드 내리기
    @objc func tapKeyboardHide (sender: UITapGestureRecognizer) {
        
        self.view.endEditing(true)
    }
    
    // 스크롤 시 키보드 내리기
    func scrollViewWillBeginDragging(_ scrollView: UIScrollView){
        
        NSLog("===== ViewController_favoriteItemAdd scrollViewWillBeginDragging =====");
        
        self.view.endEditing(true)
        
    }
    
    // 아무데나 선택 시 키보드 내리기
    override func touchesBegan(_ touches: Set<UITouch>with event: UIEvent?){
        
        self.view.endEditing(true)
        
    }
cs


나머지 코드는 아래와 같다.


이 글을 공유하기


댓글(0)

Designed by CMSFactory.NET