如何在小工具预览SwiftUI iOS 14中加载WKWebView



如何在小部件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)
}

}

不幸的是,在小工具中使用的视图有一些限制。

由于Widget视图不允许交互(Link除外(,因此不允许在Widget中使用ScrollView。我怀疑WKWebView是建立在UIScrollView之上的。

如果你想显示一些URL内容,你有两个选项:

  • 在TimelineProvider中获取数据并传递给条目
  • 使用该答案中提出的CCD_ 2

最新更新