swift - 如何在 WidgetKit 预览 SwiftUI iOS 14 中加载 WKWebView

标签 swift swiftui ios14 widgetkit

如何在widget swiftui ios 14 中加载wkwebview 我正在做这样的事情(附上代码)但它向我展示了这张图片https://www.sendspace.com/file/nw002i (从此链接下载图片)期待您的回答,我是 swiftui 的新手,我很好奇苹果是否允许这样做?

import WidgetKit
import SwiftUI
import WebKit
import Photos

struct Provider: TimelineProvider {
    func placeholder(in context: Context) -> SimpleEntry {
        SimpleEntry(date: Date())
    }

    func getSnapshot(in context: Context, completion: @escaping (SimpleEntry) -> ()) {
        let entry = SimpleEntry(date: Date())
        completion(entry)
    }

    func getTimeline(in context: Context, completion: @escaping (Timeline<Entry>) -> ()) {
        var entries: [SimpleEntry] = []

        let currentDate = Date()
        for hourOffset in 0 ..< 5 {
            let entryDate = Calendar.current.date(byAdding: .hour, value: hourOffset, to: currentDate)!
            let entry = SimpleEntry(date: entryDate)
            entries.append(entry)
        }

        let timeline = Timeline(entries: entries, policy: .atEnd)
        completion(timeline)
    }
}

struct SimpleEntry: TimelineEntry {
    let date: Date
}

struct WebWidgetEntryView : View {
    var entry: Provider.Entry
     var body: some View {
        WebView(request: URLRequest(url: URL(string: "https://www.apple.com")!))
    }      
}

@main
struct WebWidget: Widget {
    let kind: String = "WebWidget"

    var body: some WidgetConfiguration {
        StaticConfiguration(kind: kind, provider: Provider()) { entry in
            WebWidgetEntryView(entry: entry)
        }
        .configurationDisplayName("My Widget")
        .description("This is an example widget.")
    }
}

struct WebWidget_Previews: PreviewProvider {    
    static var previews: some View {
        WebView(request: URLRequest(url: URL(string: "https://www.apple.com")!))
    }

}
    
struct ActivityIndicator: UIViewRepresentable {

    @Binding var isAnimating: Bool
    let style: UIActivityIndicatorView.Style

    func makeUIView(context: UIViewRepresentableContext<ActivityIndicator>) -> UIActivityIndicatorView {
        return UIActivityIndicatorView(style: style)
    }

    func updateUIView(_ uiView: UIActivityIndicatorView, context: UIViewRepresentableContext<ActivityIndicator>) {
        isAnimating ? uiView.startAnimating() : uiView.stopAnimating()
    }
}

struct LoadingView<Content>: View where Content: View {

    @Binding var isShowing: Bool
    var content: () -> Content

    var body: some View {
        GeometryReader { geometry in
            ZStack(alignment: .center) {

                self.content()
                    .disabled(self.isShowing)
                    .blur(radius: self.isShowing ? 3 : 0)

                VStack {
                    Text("Loading...")
                    ActivityIndicator(isAnimating: .constant(true), style: .large)
                }
                .frame(width: geometry.size.width / 2,
                       height: geometry.size.height / 5)
                .background(Color.secondary.colorInvert())
                .foregroundColor(Color.primary)
                .cornerRadius(20)
                .opacity(self.isShowing ? 1 : 0)

            }
        }
    }

}


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

最佳答案

不幸的是,您可以在 WidgetKit 中使用哪些 View 存在一些限制。
由于 WidgetKit View 不允许交互(Link 除外),因此您不能在 WidgetKit 中使用 ScrollView。而且我怀疑 WKWebView 是建立在 UIScrollView 之上的。
如果要显示某些 URL 内容,您有两个选择:

  • 在 TimelineProvider 中获取数据并传递给条目
  • 使用 Data(contentsOf: url)this answer 中提出的.
  • 关于swift - 如何在 WidgetKit 预览 SwiftUI iOS 14 中加载 WKWebView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64220895/

    相关文章:

    Swift/CloudKit : After record changed, 上传触发器 "Service Record Changed"

    swift - 如何为 SwiftUI InputField 编写 UI 测试

    ios - UIPageViewController 滑动忽略 SwiftUI 的 navigationBarHidden(true)

    ios - 我应该将底部工作表作为 subview 添加到当前 View Controller ,还是推送一个添加了 subview 的 UIWindow?

    ios - 如何访问自定义 TableViewCell 中按钮的索引路径?

    swift - Realm 列表过滤器 Swift

    ios - 如何将 AppTrackingTransparency 权限添加到您的 iOS 应用程序

    swift - 同时添加多个SCNNode

    ios - SwiftUI 2.0 List with children - 如何使显示按钮的可点击区域覆盖整个列表项

    iOS 14 UISplitViewController 删除 iPad 上横向的 "hide/show"按钮?