-
[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์ ์คํ์์ผฐ์ต๋๋ค.
์น 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
'๐ iOS > ๊ฐ๋ฐ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[iOS] CocoaPods could not find compatible versions for pod ์๋ฌ ํด๊ฒฐ (0) 2023.06.12 [iOS] ์ฑ์คํ ์ด๋ก ๋งํฌ ์ฐ๊ฒฐํ๊ธฐ (apps, itunes, itms-apps, mt=8) (0) 2023.06.06 [iOS] WKWebView Content Size ๋ชจ๋ฐ์ผ์ ๋ง์ถ๊ธฐ (0) 2023.06.04 [iOS] SwiftGen์ผ๋ก ๋ฆฌ์์ค ๊ด๋ฆฌํ๊ธฐ (0) 2023.06.04 [iOS] WKWebView User Agent ์ค์ (์น๋ทฐ์ ์น๋ธ๋ผ์ฐ์ ๊ตฌ๋ถํ๊ธฐ) (0) 2023.05.30