Keyboard에 가려지는 UITextView, Cursor를 키보드 위로 유지시키기 위해 scroll offset을 조정하고 싶습니다.

1 답변 글타래를 보이고 있습니다
  • 글쓴이
    • 뚭니
      참가자
      • 글작성 : 9
      • 답글작성 : 17

      안녕하세요, 오랜만에 QnA 게시판에 질문을 남기는 뚭니입니다.

      UITextView 관련하여 난항을 겪고 있어 조언을 구하고 싶어 글을 작성합니다.

       

      먼저, 제가 구현하고자 하는 액션은 다음 영상과 같습니다.

      UITextView에 글을 작성할 때마다 줄바꿈을 하여도

      cursor가 항상 키보드 위에 위치하도록 대응하면서 height가 늘어나는 걸 볼 수 있는데요.

       

      현재 제가 구현한 모습은

      많은 글을 작성하면 키보드에 cursor가 가려져 글을 수정하기 불편한 것을 볼 수 있습니다.

       

      구글링은 textview, scroll, offset, cursor, position 과 같은 키워드로 검색을 해보았는데요,

      그 중 찾게된 stack overflow 에서 한 분께서 알려주신 방법 중


          private func scrollToCursorPositionIfBelowKeyboard() {         print("keyboardHeight", keyboardHeight)         let caret = textView.caretRect(for: textView.selectedTextRange!.start)         let keyboardTopBorder = textView.bounds.size.height - keyboardHeight         if caret.origin.y < keyboardTopBorder {             textView.scrollRectToVisible(caret, animated: true)         }     }

      위와 같은 방법, 또는 키보드 height와 상관없이 커서 위치로 scroll만 하는 경우 두가지 방법을 시도해보았습니다.


      private func scrollToCursorPosition() { let caret = textView.caretRectForPosition(textView.selectedTextRange!.start) textView.scrollRectToVisible(caret, animated: true) }

       

      참고로 keyboard 의 높이는 UIResponder.keyboardWillShowNotification을 이용하여 키보드가 보여질 때 값을 얻어오도록 하였고 keyboardHeight이란 변수로 명명하여 저장하고 출력해보았을 때 print는 잘 찍히는 것을 확인했습니다.

       

      참고한 stack overflow 링크

      How to scroll to current cursor position in UITextView?

      UITextView how to keep cursor above keyboard

       

       

      혹시 어떻게 검색하면 좋은지 키워드를 추천해주시거나

      방법을 조언해주신다면 무척 감사할 것 같습니다.

       

      좋은 하루 되세요!

    • 야곰
      키 마스터
      • 글작성 : 37
      • 답글작성 : 579

      텍스트뷰의 스크롤뷰 오프셋을 조절하는게 아니라, 텍스트뷰의 크기 자체를 조절해야 합니다.
      키보드가 올라온 높이만큼 텍스트뷰의 높이를 조절할 수 있도록 오토레이아웃 제약을 조절해보세요.

      • 뚭니
        참가자
        • 글작성 : 9
        • 답글작성 : 17

        바쁘신 와중에 답변 남겨주셔서 감사드립니다!

         

        혹시, 한가지 질문을 더 해도 될까요?

        현재는 입력한 텍스트의 높이에 따라서 텍스트뷰 높이가 동적으로 증가하도록 구현해놓은 상태인데요.

        (텍스트 뷰의 Height 를 약한 우선순위로 설정하고, 텍스트 뷰의 높이에 따라 셀의 높이가 변하도록 테이블 뷰를 업데이트 하였습니다.)

        키보드가 올라온 만큼 오토레이아웃으로 제약을 조절하더라도 텍스트 뷰가 아래로 계속 길어지면 가려지지 않을까 하여 고민입니다.

         

        텍스트 뷰의 크기 자체를 조절해야한다고 조언 해주셨는데

        크기를 고정으로 하고 오토레이아웃으로 제약을 조절해보라는 말씀이실까요?

         

        고민이 많던 중에 한줄기 빛과 같은 답변 😭 남겨주셔서 감사드립니다.

        • 야곰
          키 마스터
          • 글작성 : 37
          • 답글작성 : 579

          제가 질문의 깊은 의미를 잘못 해석했던 것 같아요.

          그렇다면 텍스트뷰의 사이즈 만큼 제약을 조절하는게 아니라, 테이블뷰 자체의 제약을 조절해야겠네요. 테이블뷰 자체의 높이를 키보드에 따라 조절해보세요.
          높이 혹은 bottom 제약에 따라 테이블뷰의 높이가 변화되도록 하면 될듯합니다. 🙂

          • 뚭니
            참가자
            • 글작성 : 9
            • 답글작성 : 17

            아닙니다! 사고를 확장시켜주셔서 감사합니다.

             

            해당 부분은 textView의 height를 동적으로 증가하면서,

            동시에 키보드 위로 유지시키려다 보니 어려움이 있었다고 생각합니다.

             

            조언해주신 방법과 테이블뷰 스크롤을 bottom으로 내리는 방법 등 여타 방법을 시도해보다가

            결국… height를 고정시켰습니다. 

            키보드 위로 올라올 만큼 짧게 height를 고정 시켜 자동으로 스크롤이 발생하게 했습니다..

             

            줄바꿈을 할 때마다 동적으로 높이를 증가하게 하니까

            계속 키보드 밑으로 내려가면서 보이지가 않네요 ㅠㅠ

            • 야곰
              키 마스터
              • 글작성 : 37
              • 답글작성 : 579

              전 이 방법도 꽤 괜찮다고 생각해요 🙂
              이 기능이 이 앱의 핵심 킬링 포인트가 아니라면, 우선 구현해두고 나중에 다시 생각날 때 돌아와서 시도해 보는게 좋지 않을까요? 🙂

1 답변 글타래를 보이고 있습니다
  • 답변은 로그인 후 가능합니다.

logo landscape small

사업자번호 : 743-81-02195
통신판매업 신고번호 : 제 2022-충북청주-1278 호
고객센터 : 카카오톡채널 @yagom