티스토리 뷰

🍏/iOS

[iOS] iOS 17 Text Selection 의 변화

eungding 2023. 11. 10. 21:22
반응형

# 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도 잘 나오는 것을 볼 수 있다! 

 

따흑 이렇게 정녕 해야하는가.. ??  하지만 다른 방법이 없는 듯하다  (🥹)

 

 

 

 

반응형
댓글