[iOS] iOS 17 Text Selection 의 변화
# iOS 17 미만
iOS 17 미만에서는
backgroundColor를 먹여도 text Selection이 그 위에 되었음
(iOS 16.4 로 테스트한 결과)
뷰계층구조를 보면 UITextSelectionRectView 가 텍스트를 나타내는 뷰보다 위에 있음을 명확히 알 수 있음.
# iOS 17
하지만 iOS 17에서는 계층 구조가 바뀜!
(베타이지만 가장 최신버전 iOS 17.2 로 테스트한 결과. 정식 하위버전도 동일함.)
17에서는 RectView가 아니라 RangeView로 바뀌고 글자를 보여주는 뷰 (_UITextLayoutFragmentView) 보다 더 하위에 위치하게 됨
RangeView 상위의 HighlightView 는 iOS 17 에 새로 나온건데 문서에도 behind 라고 적혀있었음 ;;;
# 최소 대응
그래서 background 를 구냥 디폴트값 흰색으로 지정하고 있었다면
clear 로 바꾸거나 삭제해야지 하위 OS 와 동일하게 동작을 하게 됨
# 백그라운드 필요한 앱 대응
하지만 다양한 백그라운드 컬러를 제공해주는 앱은 어떻게 해야하는 가 ??
기존처럼 백그라운드위에 selection 도 보여주고 싶다면 ??
여기 나와있는 것처럼 iOS 17만 분기해서 UITextSelectionDisplayInteraction 을 구현해주는 방법도 있을 것 같고
이미 구현되어있는 highlight 뷰를 찾아 바꾸는 방법도 있을 것 같다.
근데 이렇게 하면 동작안함 (잘 기억이 안나는데 부모 뷰 내에서만 해당하는 순서일 듯. 원하는 대로 동작하려면 부모 뷰도 zposition 을 같이 높여야할 것 같음)
if #available(iOS 17.0, *) {
self.textView.interactions.forEach {
if let interaction = $0 as? UITextSelectionDisplayInteraction {
interaction.highlightView.layer.zPosition = 100
}
}
}
하지만 부모뷰가 UIView 라서 이걸 찾기는 좀 그러니
텍스트를 담고 있는 _UITextContainerView 를 찾아서 zIndex 를 낮춰주자
self.textView.subviews.forEach { view in
if String(describing: type(of: view)) == "_UITextContainerView" {
view.layer.zPosition = -100
}
}
// -100은 제가 임의로 넣은 값! -1로 해도 무방함.
백그라운드 위에 selection도 잘 나오는 것을 볼 수 있다!
따흑 이렇게 정녕 해야하는가.. ?? 하지만 다른 방법이 없는 듯하다 (🥹)