ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [iOS] HTML String์œผ๋กœ WKWebView ๋กœ๋“œํ•˜๊ธฐ
    ๐ŸŽ iOS/๊ฐœ๋ฐœ 2023. 6. 14. 17:48

     

    HTML String์„ UILabel์— ์ ์šฉํ•˜๋Š” ๋“ฑ์˜ ๊ฐ„๋‹จํ•œ ์ž‘์—…์€ String Extension์„ ์ถ”๊ฐ€ํ•ด์„œ ์•„๋ž˜์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

     

    extension String {
        var htmlToAttributedString: NSAttributedString? {
            guard let data = self.data(using: .utf8) else { return nil }
            do {
                return try NSAttributedString(data: data,
                                              options: [.documentType: NSAttributedString.DocumentType.html,
                                                        .characterEncoding:String.Encoding.utf8.rawValue],
                                              documentAttributes: nil)
            } catch {
                return nil
            }
        }
    }
    myLabel.attributedText = htmlText.htmlToAttributedString

     

     

    ๊ทธ๋Ÿฐ๋ฐ ์ œ ๊ฒฝ์šฐ๋Š” ๋ณด์—ฌ์ค˜์•ผ ํ•˜๋Š” HTML String์— CSS linkํƒœ๊ทธ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๊ณ ,

    linkํƒœ๊ทธ๊ฐ€ ์™ธ๋ถ€์˜ stylesheet์™€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์–ด ์›น url์— ์ ‘๊ทผํ•ด์„œ CSS ์„ค์ •์„ ์ ์šฉํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

     

    ๊ทธ๋ž˜์„œ ์›น url์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก loadHTMLString ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด

    HTML String์„ ์ง์ ‘ WKWebView์— ๋กœ๋“œํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค!

     

     


     

    loadHTMLString

    var webview = WKWebView()
    
    override func viewDidLoad() {
        self.webview.frame = self.view.frame
        self.view.addSubview(self.webview)
        
        let styleFormat = "<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no\">%@"
        let html = "<link rel=\"stylesheet\" type=\"text/css\" href="๋งํฌ" /><div>๋‚ด์šฉ</div>"
        
        let htmlString = String(format: styleFormat, html)
        self.webview.loadHTMLString(htmlString, baseURL: nil)
    }

     

    ์šฐ์„  ๋ทฐ ์ „์ฒด๋ฅผ ๊ฝ‰ ์ฑ„์šฐ๋Š” ์›น๋ทฐ๋ฅผ ๋งŒ๋“ค์–ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

     

    html์ด๋ผ๋Š” ๋ณ€์ˆ˜์— HTML String์„ ์ž‘์„ฑํ•ด์ฃผ์—ˆ๊ณ 

    ('๋งํฌ', '๋‚ด์šฉ'์—๋Š” ๊ฐ์ž ํ•ด๋‹นํ•˜๋Š” ํ…์ŠคํŠธ ๋„ฃ์œผ์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค!)

     

    styleFormat์ด๋ผ๋Š” ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€๋กœ ์ž‘์„ฑํ•ด์ฃผ์—ˆ๋Š”๋ฐ์š”.

    ์ด ๋ณ€์ˆ˜๋Š” HTML String์„ ์›น๋ทฐ์— ๋กœ๋“œํ•  ๋•Œ ๋ชจ๋ฐ”์ผ์— ์ตœ์ ํ™”๋œ ํ™”๋ฉด์„ ๊ทธ๋ฆฌ๋„๋ก ํ•˜๋Š” meta ํƒœ๊ทธ๋ฅผ ๋‹ด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

     

     

    • width=device-width : ๊ธฐ์กด์— ์™ผ์ชฝ ํ™”๋ฉด์ฒ˜๋Ÿผ ๋ณด์ด๋˜ ์ปจํ…์ธ ๊ฐ€ ์˜ค๋ฅธ์ชฝ ํ™”๋ฉด์ฒ˜๋Ÿผ ๋ชจ๋ฐ”์ผ ๋””๋ฐ”์ด์Šค์˜ ๋„ˆ๋น„์— ๋งž๊ฒŒ ์กฐ์ •๋ฉ๋‹ˆ๋‹ค.
    • initial-scale=1.0 : ์ดˆ๊ธฐ zoom ํฌ๊ธฐ๋ฅผ 1๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
    • minimum-scale=1.0 : ์ตœ์†Œ zoom ํฌ๊ธฐ๋ฅผ 1๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
    • maximum-scale=1.0 : ์ตœ๋Œ€ zoom ํฌ๊ธฐ๋ฅผ 1๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
    • user-scalable=no : ์œ ์ €์˜ double touch๋‚˜ pinch๋ฅผ ํ†ตํ•œ zoom action์„ ๋ง‰์Šต๋‹ˆ๋‹ค.

     

     

    ์ด ํƒœ๊ทธ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค๋ฉด ์ œ๊ฑฐํ•˜๊ณ  ๋ฐ”๋กœ loadHTMLString์— html๋ณ€์ˆ˜๋ฅผ ๋„ฃ์–ด ์‹คํ–‰ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

    ์ €๋Š” meta ํƒœ๊ทธ ๋’ค์— html ๋ณ€์ˆ˜๋ฅผ ๋ถ™์—ฌ์„œ loadHTMLString์„ ์‹คํ–‰์‹œ์ผฐ์Šต๋‹ˆ๋‹ค.

     

    width=device-width ์ ์šฉ ์ „ํ›„

     

    ์›น CSS ํŒŒ์ผ๋กœ๋ถ€ํ„ฐ ๊ฐ€์ ธ์˜จ ์Šคํƒ€์ผ์ด ์ ์šฉ๋œ ๋ชจ์Šต์ž…๋‹ˆ๋‹ค! ๐Ÿ‘

     

     

     


     

    Dynamic Height

    ๋งŒ์•ฝ ์›น๋ทฐ์˜ ๋†’์ด๊นŒ์ง€ ์ปจํ…์ธ  ๋†’์ด์— ๋งž์ถฐ ์กฐ์ ˆํ•ด์ฃผ๊ณ  ์‹ถ๋‹ค๋ฉด ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

     

    class ViewController: UIViewController {
        override func viewDidLoad() {
            self.webView.navigationDelegate = self
        }
    }
    
    extension ViewController: WKNavigationDelegate {
        func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
            self.webView.evaluateJavaScript("document.readyState", completionHandler: { (complete, error) in
                if complete != nil {
                    self.wv.evaluateJavaScript("document.body.scrollHeight", completionHandler: { (height, error) in
                        self.webViewHeight.constant = height as! CGFloat
                    })
                }
            })
        }
    }

     

    WKNavigationDelegate๋ฅผ ์ฑ„ํƒํ•˜๊ณ ,

    navigationDelegate ๋Œ€๋ฆฌ์ž๋ฅผ ์„ค์ •ํ•˜๊ณ ,

     

    didFinish ํ•จ์ˆ˜์—์„œ ์ปจํ…์ธ ์˜ ๋†’์ด๋ฅผ ๋ฐ›์•„์˜ค๋ฉด ๋˜๋Š”๋ฐ,

    didFinish๊ฐ€ ๋ถˆ๋ ธ๋‹ค๊ณ  ์ปจํ…์ธ ์˜ ์‚ฌ์ด์ฆˆ๊ฐ€ ๋ฐ”๋กœ ๊ฒฐ์ •๋˜๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ์„œ ํ•œ ๋‹จ๊ณ„๋ฅผ ๋” ์ˆ˜ํ–‰ํ•ด์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

     

    document์˜ ๋กœ๋”ฉ ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜๋Š” document.readyState ์Šคํฌ๋ฆฝํŠธ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•ด์ฃผ๋Š”๊ฑด๋ฐ์š”.

    ์‹คํ–‰ ๊ฒฐ๊ณผ ๋กœ๋”ฉ์ด ์™„๋ฃŒ๋˜์—ˆ๋‹ค๋ฉด ๊ทธ ๋•Œ document.body.scrollHeight ์Šคํฌ๋ฆฝํŠธ ํ•จ์ˆ˜๋กœ ์‹คํ–‰ํ•ด์„œ ๋†’์ด๋ฅผ ๋ฐ›์•„์˜ค๋ฉด ๋ฉ๋‹ˆ๋‹ค.

     

     

     

     


    ์ฐธ๊ณ 

    https://stackoverflow.com/questions/37048759/swift-display-html-data-in-a-label-or-textview

    https://stackoverflow.com/questions/27515236/how-to-determine-the-content-size-of-a-wkwebview

    ๋Œ“๊ธ€

Designed by Tistory.