[swift] 키보드가 활성화될 때 view를 올려라.

2018. 4. 3. 17:30Programming/Swift

반응형


키보드가 활성화 될 때 하단 부분은 가려지게 될 것이다.

반드시 보여져야 하는 레이어들이라면 키보드 위로 올려서 보여질 수 있게 해보자.

let inputTyping = UITextView()

let buttonExecution = UIButton()

override func viewDidLoad() {

    super.viewDidLoad()

    let tap:UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(self.dismissKeyboard))

    self.view.addGestureRecognizer(tap)

    NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardShow), name: NSNotification.Name.UIKeyboardWillShow, object: nil)

    NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardHide), name: NSNotification.Name.UIKeyboardWillHide, object: nil)

}

@objc func dismissKeyboard() {

    self.view.endEditing(true)

}

@objc func keyboardShow(notification: NSNotification) {

        if let keyboardSize = (notification.userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue {

            if self.view.frame.origin.y == 0 {

                self.view.frame.origin.y -= keyboardSize.height

                self. inputTyping.frame.origin.y -= keyboardSize.height

                self. buttonExecution.frame.origin.y -= keyboardSize.height

        }

    }

}

@objc func keyboardHide(notification: NSNotification) {

    if let keyboardSize = (notification.userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue {

        if self.view.frame.origin.y != 0 {

            self.view.frame.origin.y += keyboardSize.height

             self. inputTyping.frame.origin.y += keyboardSize.height

            self. buttonExecution.frame.origin.y += keyboardSize.height

        }

    }



나의 삽질은 어디까지 인 것인가?


화면의 반을 차지하는 imageView, 그 아래 textView, 그 아래 button 이 위치하도록 구현을 하였다.

여기서 내가 원하던 것은 키보드가 활성화 될 때 일부로 버튼이 보여지지 않게 하고 imageView 와 textView 창만 올라가게 끔 하려고 했다.

물론 위 소스와 동일하게 했을 시 잘 올라간다.

여기서 더 욕심을 내서 textView를 키보드 바로 위로 맞춰서 하는게 나의 목표였다.

이해가 되질 않는다면 아래 그림을 보면 될 것이다.



그런데....

키보드 바로 위로 textView를 맞춰지지 않는 것이다.

키보드에 가려져 보이지 않거나, 반만 보이거나, 너무 위로 올라가서 키보드와의 간격이 넓어지거나

온갖(?) 방법을 다 해보았다.

온갖 방법이란 내 머리속의 수학 아닌 산수를 동원하여, 위치값까지 하나하나 찾아가고,

"일단 키보드가 바라보는 디바이스의 위치값과 뷰안에 존재하는 위치값은 다를 수 있지!!" 라며

말이 되는 가설과 말도 안되는 가정들을 노트에 수십번을 적어가며

계산하고 계산하였다.


이렇게 구구절절 얘기하는 것은 그만큼 삽질을 많이 했다는 얘기이다.

결국에는 내가 세운 계산법으로는 해내지 못하였다.


포기하고 버튼도 위로 올려버렸다.

위 소스에서 한줄만 더 추가하면 된다.

소스의 파란색 글씨가 그것이다.

1. keyboardShow => self. buttonExecution.frame.origin.y -= keyboardSize.height

2. keyboardHide => self. buttonExecution.frame.origin.y += keyboardSize.height  


허무하게 이 한줄을 넣고 시뮬레이션을 돌리는 순간.

유레카!!!!


이 한줄 추가하면서 모든게 제대로 잘 보여지는데,

아래 버튼 사이즈만 내려볼까?

라는 생각이 들어버렸다.


되면 당연히 좋지만, 한편으로는 엄청 허무할 것 같다는 생각이 들었다.

성공

@objc func keyboardShow(notification: NSNotification) {

        if let keyboardSize = (notification.userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue {

            let keyboardResize = keyboardSize.height - createButton.frame.height

            if self.view.frame.origin.y == 0 {

                self.view.frame.origin.y -= keyboardResize

                self. textView.frame.origin.y -= keyboardResize

        }

    }

}


성공은 했지만, 버튼을 위로 올리는 것이 나을 것 같아서 적용은 하지 않았다.

추후에 적용할 일이 생기면 참고하기 위해서 이렇게 글로 남겨 놓는다.

매번 느끼는 것이지만 항상 허무한 결론이다.


참고 URL

https://stackoverflow.com/questions/26070242/move-view-with-keyboard-using-swift


반응형