[iOS] UIScrollView + UITextView 마지막 텍스트 짤리는 현상

UIScrollView + UITextView 마지막 텍스트 짤리는 현상

안녕하세요 물먹고하자 입니다 :)
출시했던 앱에서 발생한건으로 운영하면서 딱히 문제가 나오진 않았었는데
유독 iOS18이후로 하나 둘씩 문제가 발생하고 있네요. (해당부분은 iOS16에서도 동일하게 발생했음)
이슈가 되었던 부분과 해결과정, 해결했던 내용 공유드립니다.


1. UIScrollView + UITextView 사용했던 이유? 문제는?

💡 내용(String) 부분을 보여주는 화면 줌 In/Out 기능을 사용하고 있는중.

  • 문제는? 전부 짤리는것도 아니며, 긴 링크 뒤에 띄어쓰기 후 들어간 텍스트가 안보이는현상
  • ex) https://…….(생략)……. 텍스트영역
  • PC 버전에서 보이는 링크 + 텍스트 영역 "아마링크 포함전송(이게 문제껀)" 보임
  • 아이폰에서 링크 + 텍스트 영역 "아마링크 포함전송(이게 문제껀)" 짤림

2. Xcode 디버그 확인, UITextView 단독으로 쓰면?

💡 실험1) ScrollView + UITextView => UITextView 만 사용시 : 정상적으로 노출됨(짤림현상없음)
💡 실험2) ScrollView + UITextView 디버그 해보자 : 마지막 텍스트영역이 잡히지 않음

실험을 진행하다가 여기에서 방향성에 대한고민을 하게 되었는데,
UITextView 단독으로 사용시 정상, UISCrollView + UITextView 사용시 특정 길이에서만 문제

방안1) Link 뒤에 텍스트가 온다면 강제개행을 넣는다? (원본 훼손)
방안2) UITextView만 사용하고, 줌 기능을 핀치줌을 통해 Font를 키운다? (의도X)
방안3) UIScrollView + UITextView 어떻게든 살린다.. (막막함)

  • 링크영역까지는 UITextView에서 잡혔는데, 마지막 텍스트의 위치가 렌더링 되지 않음

  • 방안2를 만들었었는데, 의도부분에서 원치 않는다는 의견이 많아 결국 방안3 을 채텍


3. 왜? UITextView 단독으로 썼을때는 나온것일까?

  • UITextView 내부의 ScrollView에서 1.링크 렌더링 후 2.텍스트를 렌더링을 해서 contentSize가 갱신되는걸로 추측됨
  • 예상되는 문제점은 UITextView에서 1.링크 렌더링 후 contentSize가 껍데기 UISCrollView에 맞춰지고, 이후 2.텍스트를 렌더링 되려고 했지만 Size가 맞지 않는건가? (여기까진 추측)

4. UIScrollView + UITextView 포기는 못하고 비슷한 사례?

💡 유사사례 : https://stackoverflow.com/questions/33427068/scroll-to-the-bottom-of-textview-programmatically
💡 UITextView.layoutManager.allowsNonContiguousLayout = false 처리후 정상적으로 보인다는 글
💡 참고 : allowsNonContiguousLayout

  • UITextView.layoutManager.allowsNonContiguousLayout = false
  • 옵션값을 넣으니 갑자기 정상표현이 되었다?!

allowsNonContiguousLayout 보통.. 기본값이 false 일것 같아서 디버그 멈추고, 값 넣기 전에 디버그로 찍어보았는데, 이상한점 발견

  • 찍힌내용을보면 layoutManager 사용하면 TextKit1로 스위칭된다.
  • 그렇다면 allowsNonContiguousLayout 옵션설정이 아닌 TextKit1로 지정을 해도 동일하다는 소리
  • 역시 동일하게 잘 표현되고 있다. (언제나 그렇지만 힘들게 실험한건 간단하게 끝날때가 많다)

#. TextKit1, TextKit2 무슨 차이가 나서 이런걸까?

💡 렌더링부분에 대한건 체감상 알겠고, 디테일한 부분은 정확히 몰라서 검색한부분 메모

구분 TextKit 1 TextKit 2
기본 사용 방식 layoutManager 사용 NSTextLayoutManager 사용
레이아웃 방식 줄 단위 레이아웃 블록 단위 레이아웃
allowsNonContiguousLayout 설정 가능 (true/false 변경 가능) 직접 설정 불가능 (기본적으로 false)
성능 긴 문서에서 성능 저하 가능 최적화된 메모리 사용으로 성능 향상
렌더링 방식 수동 레이아웃 필요 자동 동적 레이아웃
iOS 지원 버전 iOS 7 이상 iOS 15 이상

마무리

오랜만에 찾는 과정이 힘들었던 건이였네요.
솔직히 지금도 UITextView의 TextKit1, TextKit2 렌더링 방식이 틀리다라는점
빼고는 TextKit2에서도 안될 이유가 없어보이는데… 라는 생각이 드네요.

UITextView에 딥하게 작업을 하는게 아니다 보니, 간단하게 TextKit1 방식으로 변경하여 해결했네요.

오늘은 이만~

즐거운 코딩 되게요.

끝.

댓글