진행 중이던 프로젝트에서 TextView에 링크를 거는 작업을 해 보았다.
먼저 링크를 걸고 싶은 TextView에 다음과 같은 몇 가지 설정을 해주어야 한다.
_ = contentTextView.then { $0.isUserInteractionEnabled = true $0.isSelectable = true //Default $0.isEditable = false $0.dataDetectorTypes = .link $0.delegate = self }
어떤 설정인지 차근차근 살펴보자.
isUserInteractionEnabled
먼저 isUserInteractionEnabled는 유저의 이벤트가 event queue로부터 무시되고 삭제됐는지 판단하는 Boolean 값이다.
false로 설정하면 touch나 keyboard와 같은 이벤트는 event queue로 부터 무시되고 삭제가 된다.
반면, true로 설정했을 때는 이벤트가 정상적으로 view에 전달이 된다. 디폴트 값은 true이다.
사용자가 링크를 클릭했을 때 정상적으로 접속하기 위해서 필요한 옵션이다.
isSelectable
isSelectable은 텍스트를 선택할 수 있는지 여부를 나타내는 Boolean 값이다.
이 기능을 true로 설정할 시 텍스트를 꾹 누르게 되면 복사, 찾아보기, 공유하기 등의 기능이 활성화가 된다.
디폴트 값은 true이다.
isEditable
isEditable은 텍스트를 편집 할 수 있는지 여부를 나타내는 Boolean 값이다.
디폴트 값은 true이다.
dataDetectorTypes
dataDetectorTypes은 텍스트에서 탭이 가능한 URL로 변환되는 데이터 유형이다.
이 속성을 사용하여 텍스트에서 URL로 자동 변환되어야 하는 데이터 유형 (전화번호, http 링크 등)을 지정할 수 있다.
주의! 텍스트의 isEditable 속성이 true로 설정된 경우, 데이터 감지가 발생하지 않는다.
그리고 UITextView Delegate 메서드를 사용해야 하기 때문에 delegate도 지정을 해 주어야 한다.
다음은 텍스트 뷰에서 링크를 클릭했을 때 실행될 메서드이다.
func textView(_ textView: UITextView, shouldInteractWith url: URL, in characterRange: NSRange, interaction: UITextItemInteraction) -> Bool { // 링크 연결 코드 let safariViewController = SFSafariViewController(url: url) self.present(safariViewController, animated: true, completion: nil) return false }
나는 앱 내부에서 링크된 사파리에 접속하기 위해 SFSafariViewController를 사용했다.
이 함수 안에서 링크를 클릭했을 경우, 발생시킬 이벤트를 설정할 수 있다.
물론 .delegate=self를 꼭 해야 함수 사용이 가능하다.
'Study > iOS' 카테고리의 다른 글
[iOS] Core Animation (0) | 2022.07.18 |
---|---|
[iOS] CALayer (0) | 2022.07.14 |
[iOS] UITextView와 UITextField의 차이 정리 (2) | 2021.03.17 |
[iOS] 뷰 생명주기(View life cycle)에 대해서 알아보자 (1) | 2021.03.07 |
[iOS] 앱 생명주기(App life cycle)에 대해서 알아보자 (3) | 2021.03.05 |