サンプル
GitHub - akuraru/WebViewSample
悪い実装
Dynamic Typeでさらに大きいフォントサイズを使った場合にWKWebViewで表示されている内容が表示されなくなる問題が発生しました。SwiftUIでButtonの中にWKWebViewを表示した場合に起こります。これは、見た目はWebViewで表示して、タップした時の処理をButton側で行うためです。この実装の場合にDynamic Typeでフォントサイズを大きくした場合にWebViewのサイズが0になり、内容が表示されなくなります。
struct BadWebView: View { let wkWebView = WKWebView() let action: () -> Void var body: some View { Button(action: action) { WebView(wkWebView: wkWebView) } .onAppear { wkWebView.load(URLRequest(url: URL(string: "https://www.apple.com")!)) } } } struct WebView: UIViewRepresentable { let wkWebView: WKWebView func makeUIView(context: Context) -> some UIView { wkWebView } func updateUIView(_ uiView: UIViewType, context: Context) { } }
改善した実装
ZStackでWebViewをButtonの裏に隠してWebViewを完全に覆いました。これは、見た目はWebViewで表示して、タップした時の処理をButton側を行いつつ、フォントサイズを大きくしてもWebViewは表示されたままになります。
struct GoodWebView: View { let wkWebView = WKWebView() let action: () -> Void var body: some View { ZStack { WebView(wkWebView: wkWebView) Button(action: action) { Color.clear } } .onAppear { wkWebView.load(URLRequest(url: URL(string: "https://www.apple.com")!)) } } }