【问题标题】:How do I insert an iframe inside SwiftUI View?如何在 SwiftUI 视图中插入 iframe?
【发布时间】:2019-07-16 11:20:06
【问题描述】:

我想在新的 SwiftUI 框架中加载一个webView。我该怎么做?

struct SubmissionFlowFrame: View {

    var body: some View {
        // I want to insert the iframe here
    }
}

【问题讨论】:

  • 除非它是原生的 SwiftUI View(我不相信它是),否则你需要 (1) 让它在 UIKit 中随心所欲地工作(或者作为视图或视图控制器)和(2)使其“相关”(如UIViewRelatableUIViewControllerRelatable。这里有一些问题可以接受答案以及一些很好的例子。祝你好运!

标签: webview uiwebview webkit swiftui


【解决方案1】:

您可以通过符合UIViewRepresentable 来使用任何UIView 并实现所需的方法,如下所示:

struct WebView: UIViewRepresentable {

    func makeUIView(context: Context) -> WKWebView {
        WKWebView(frame: .zero)
    }

    func updateUIView(_ view: WKWebView, context: UIViewRepresentableContext<WebView>) {

        let request = URLRequest(url: URL(string: "https://google.com")!)

        view.load(request)
    }
}

然后像普通的 swiftUI View 这样使用它:

struct ContentView : View {

    var body: some View {
        WebView()
    }
}

并且不要忘记像这种情况一样导入 UIKit 依赖项:

import WebKit

【讨论】:

    【解决方案2】:
    import SwiftUI
    import WebKit
    
    struct WebView: UIViewRepresentable {
    
        func makeUIView(context: UIViewRepresentableContext<WebView>) -> WebView.UIViewType {
            WKWebView(frame: .zero)
        }
    
        func updateUIView(_ uiView: WKWebView, context: UIViewRepresentableContext<WebView>) {
            let request = URLRequest(url: URL(string: "https://apple.com")!)
            uiView.load(request)
        }
    
    }
    
    struct ContentView: View {
    
        var body: some View {
            WebView()
        }
    }
    
    struct ContentView_Previews: PreviewProvider {
        static var previews: some View {
            ContentView()
        }
    }
    

    【讨论】:

      【解决方案3】:

      嗯,目前没有直接的方法可用。

      但您可以使用 UIViewRepresentable 并用它包裹视图。

      像这样:

      struct ContentView : UIViewRepresentable {
      
          func makeUIView(context: Context) -> WKWebView  {
              let webView = WKWebView()
              let request = URLRequest(url: URL(string: "https://www.apple.com")!)
              webView.load(request)
              return webView
          }
      
          func updateUIView(_ uiView: WKWebView, context: Context) { }
      }
      
      #if DEBUG
      struct ContentView_Previews : PreviewProvider {
          static var previews: some View {
              ContentView()
          }
      }
      #endif
      

      别忘了import WebKit

      【讨论】:

        【解决方案4】:

        您可以使用 UIViewRepresentablewebView 包装在 SwiftUI 中。

        import SwiftUI
        import WebKit
        
        struct ContentView: View {
          var body: some View {
            WebView()
          }
        }
        
        struct WebView: UIViewRepresentable {
          func makeUIView(context: Context) -> WKWebView {
            return WKWebView()
          }
          func updateUIView(_ webView: WKWebView, context: Context) {
                let request = URLRequest(url: URL(string: "https://www.apple.com")!)
                webView.load(request)
          }
        }
        

        【讨论】:

          【解决方案5】:

          使用WebView 加载url 请求,如:

          WebView {
              $0.load(URLRequest(url: .init(string: "https://google.com")!))
          }
          

          有了这个简单的结构

          import WebKit
          struct WebView: ViewRepresentableHelper {
              var configuration = { (view: WKWebView) in } // ? This has a gift for you
          }
          

          ? 弹跳!

          您可以将WKWebView 替换为几乎ANY 其他UIKitAppKit 组件,使其在SwiftUI 代码中可用! 例如:

          struct IndicatorView: ViewRepresentableHelper {
              var configuration = { (view: UIActivityIndicatorView) in }
          }
          

          用法:

          IndicatorView {
              $0.startAnimating()
          }
          

          适用于 iOS 和 macOS

          别忘了实现这个强大的扩展:

          #if os(macOS)
          public typealias ViewRepresentable = NSViewRepresentable
          public typealias NativeView = NSView
          #elseif os(iOS)
          public typealias ViewRepresentable = UIViewRepresentable
          public typealias NativeView = UIView
          #endif
          
          public protocol ViewRepresentableHelper: ViewRepresentable {
              associatedtype ViewType: NativeView
              var configuration: (ViewType) -> () { get set }
              func new() -> ViewType
          }
          
          public extension ViewRepresentableHelper {
              func new() -> ViewType { ViewType() }
          }
          
          public extension ViewRepresentableHelper {
              func makeView(_ context: Context) -> ViewType {
                  let view = new()
                  view.setContentHuggingPriority(.defaultHigh, for: .vertical)
                  view.setContentHuggingPriority(.defaultHigh, for: .horizontal)
                  return view
              }
              func updateView(_ view: ViewType, _ context: Context) { configuration(view) }
          
              func makeUIView(context: Context) -> ViewType { makeView(context) }
              func makeNSView(context: Context) -> ViewType { makeView(context) }
              func updateUIView(_ uiView: ViewType, context: Context) { updateView(uiView, context) }
              func updateNSView(_ nsView: ViewType, context: Context) { updateView(nsView, context) }
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2022-01-09
            • 2020-07-15
            • 2019-11-18
            • 2011-02-16
            • 1970-01-01
            • 2021-05-25
            • 2021-07-08
            • 1970-01-01
            相关资源
            最近更新 更多