๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐ŸŽ iOS/UIKit

[iOS/Swift] TextView - URL (ํ•˜์ดํผ๋งํฌ)ํด๋ฆญํ•ด ์›น๋ทฐ ๋„์›Œ์ฃผ๊ธฐ

by Danna 2022. 1. 25.
728x90
728x90

์•ˆ๋…•ํ•˜์„ธ์š”. UITextView ์— ํ•˜์ดํผ๋งํฌ๋กœ URL ์„ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•ด ๋ฐฉ๋ฒ•์„ ์ฐพ์•„๋ณธ ๋‚ด์šฉ์„ ์ •๋ฆฌํ•˜๋Ÿฌ ์™”์Šต๋‹ˆ๋‹ค!

 

์ฒ˜์Œ์—๋Š” UILabel ์—์„œ ์ ์šฉํ•˜๋ ค๊ณ  ํ–ˆ๋Š”๋ฐ ๋ฐฉ๋ฒ•์ด ๋ณต์žกํ•ด์„œ UITextView ๋กœ ๋ฐ”๊ฟจ์Šต๋‹ˆ๋‹ค.

- UILabel ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ํ•ด๋‹น ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ•˜๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์•„์š”.

 

๐Ÿ“ ๋ชฉ์ฐจ

1. TextView ์˜ dataDetectorTypes ์†์„ฑ ์„ค์ •ํ•˜๊ธฐ

2. UITextViewDelegate ๋ฅผ ํ†ตํ•ด WKWebView ๋„์›Œ์ฃผ๊ธฐ

 

์ด ๋‘๊ฐ€์ง€ ๊ณผ์ •์„ ํ†ตํ•ด TextView ์˜ ํ…์ŠคํŠธ ์ค‘ Http links ๋ฅผ ํด๋ฆญํ•ด ์›น๋ทฐ๋ฅผ ๋„์›Œ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

1. TextView ์˜ dataDetectorTypes ์†์„ฑ ์„ค์ •ํ•˜๊ธฐ

UITextView ์—๋Š” dataDetectorTypes ์†์„ฑ์ด ์žˆ์–ด, phone numbers, http links ๋“ฑ์„ ์ž๋™์œผ๋กœ ์ธ์‹ํ•ด URL ๋กœ ๋ณ€ํ™˜ํ•ด์ฃผ๊ณ  ์•ฑ์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŽธ์ง‘์ด ๊ฐ€๋Šฅํ•œ ๋ชจ๋“œ( isEditable == true )์—์„œ๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์–ด์š”.

๐Ÿ‘‰ ๊ณต์‹ ๋ฌธ์„œ : UITextView - dataDetectorTypes

 

UITextView ์˜ ํŽธ์ง‘๊ณผ ์Šคํฌ๋กค์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๊ฒŒ ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ์Šคํฌ๋กค์ด ๊ฐ€๋Šฅํ•˜๊ฒŒ ์„ค์ •๋˜์–ด ์žˆ์œผ๋ฉด, ๋†’์ด๋ฅผ ๊ณ ์ •์œผ๋กœ ์„ค์ •ํ•ด์ฃผ์–ด์•ผ ํ•ด์š”! 

 

dataDetectorTypes ๋ฅผ link ๋กœ ์„ค์ •ํ•˜๊ณ , text ์— http links ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ์ž๋™์œผ๋กœ ํ•˜์ดํผ๋งํฌ๊ฐ€ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค ๐Ÿ˜ณ๐Ÿ‘ 

 

class ViewController: UIViewController {

    let textView = UITextView()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        setupLayout()
        setupAttributes()
    }

    private func setupAttributes() {
        textView.delegate = self
        textView.isEditable = false
        textView.isScrollEnabled = false
        textView.dataDetectorTypes = .link
        textView.text = "Take a look ๐Ÿ‘‡ \n https://developer.apple.com/"
        textView.textAlignment = .center
    }
}

2. UITextViewDelegate ๋ฅผ ํ†ตํ•ด WKWebView ๋„์›Œ์ฃผ๊ธฐ

UITextView ์— ์žˆ๋Š” ํ•˜์ดํผ๋งํฌ๋ฅผ ๋ˆ„๋ฅด๊ฒŒ ๋˜๋ฉด, dataDetectorTypes ์„ค๋ช…์— ๋‚˜์™€์žˆ๋Š”๋Œ€๋กœ URL ์„ ํ•ธ๋“ค๋งํ•  ์‚ฌํŒŒ๋ฆฌ ์•ฑ์„ ์—ด์–ด์ค๋‹ˆ๋‹ค. 

 

์•ฑ ๋‚ด์—์„œ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋„๋ก WebView ๋ฅผ ๋„์›Œ์ฃผ๋ ค๋ฉด, delegate ๋ฅผ ์ฑ„ํƒํ•ด textView(_:shouldInteractWith:in:interaction:) ๋ฉ”์†Œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค ๐Ÿ™‚

๐Ÿ‘‰ ๊ณต์‹๋ฌธ์„œ : UITextViewDelegate - textView(_:shouldInteractWith:in:interaction:)

 

ํ•ด๋‹น ๋ฉ”์†Œ๋“œ์˜ ๋ฐ˜ํ™˜๊ฐ’์ด true ์ด๋ฉด ๊ธฐ๋ณธ ๋™์ž‘์œผ๋กœ ์‚ฌํŒŒ๋ฆฌ ์•ฑ์„ ์—ด์–ด์ฃผ๊ณ , false ์ด๋ฉด ๊ธฐ๋ณธ ๋™์ž‘์„ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. 

 

๋ฉ”์†Œ๋“œ ๋‚ด์—์„œ WebViewController ๋ฅผ ์ง์ ‘ ์ƒ์„ฑํ•˜๊ณ , text ์—์„œ ๋„˜์–ด์˜จ URL ์„ ์ธ์ž๋กœ ๋„˜๊ฒจ ํ™”๋ฉด์— ๋„์›Œ์ค๋‹ˆ๋‹ค.

 

extension ViewController: UITextViewDelegate {
    func textView(_ textView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange, interaction: UITextItemInteraction) -> Bool {
        let webViewController = WebViewController(URL)
        present(webViewController, animated: true, completion: nil)
        return false
    }
}

 

์ฐธ๊ณ ๋กœ WebViewController ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์€ WKWebView ๋ฌธ์„œ์— ๋‚˜์™€์žˆ์Šต๋‹ˆ๋‹ค.

import UIKit
import WebKit

class WebViewController: UIViewController, WKUIDelegate {
    
    var myURL: URL?
    var webView: WKWebView!
    
    init(_ url: URL?) {
        super.init(nibName: nil, bundle: nil)
        myURL = url
    }
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    override func loadView() {
        let webConfiguration = WKWebViewConfiguration()
        webView = WKWebView(frame: .zero, configuration: webConfiguration)
        webView.uiDelegate = self
        view = webView
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        guard let myURL = myURL else { return }
        let myRequest = URLRequest(url: myURL)
        webView.load(myRequest)
    }
}

UITextView & WKWebView

 

์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์œ„์˜ ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•˜์‹ค ์ˆ˜ ์žˆ์–ด์š”! (Autolayout ์ง€์ •์€ ํ•˜์…”์•ผํ•ฉ๋‹ˆ๋‹ค..)

UITextView ์™€ WKWebView ๋ฅผ ์ด์šฉํ•ด http links ๋ฅผ ํ•˜์ดํผ๋งํฌ๋กœ ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์ด์—ˆ์Šต๋‹ˆ๋‹ค! ๐Ÿ™‡‍โ™€๏ธ

 

์ฐธ๊ณ  ๋งํฌ

[SWIFT] TextView์— ๋งํฌ ๊ฑธ๊ธฐ ๋ฐ ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ ์ด๋™

๐Ÿ‘‰ https://g-y-e-o-m.tistory.com/158

 

SwiftRichString ์„ ํ†ตํ•ด์„œ๋Š” HTML ์ฒ˜๋Ÿผ ์ž‘์„ฑํ•ด <a href> ํƒœ๊ทธ๋ฅผ ๋„ฃ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ‘‰ https://github.com/malcommac/SwiftRichString#customize-xml-rendering-react-to-tags-attributes-and-unknown-tags


* ์ฐพ์•„๋ดค๋˜ ๊ฒ€์ƒ‰์–ด? uilabel clickable link / swift hyperlink in label

728x90
728x90