您如何在 Swift Playgrounds 中的 iPad 上的 SwiftUI 中渲染 Text("Content") 与 Mac 上的 Xcode?

问题描述

以上代码在 Mac 上运行,使用 Xcode 编辑器。但是,在使用 Swift Playground 编辑器的 iPad 上,相同的代码返回:abort() called。如何在 iPad 上渲染 Text()?

我按照此视频中的说明进行操作:

https://developer.apple.com/videos/play/wwdc2020/10643/

我在 Apple 的开发者论坛上发现了一个类似的问题,但没有真正的解决方案:

https://developer.apple.com/forums/thread/667357

我尝试减小尺寸,但没有帮助:

“我会根据 Abort() 的另一个问题假设,如果 Abort() 即将崩溃,则会调用它,并且视图似乎没有在实时视图中获得屏幕的边界,所以它不知道如何/在哪里渲染视图。”

import SwiftUI
import PlaygroundSupport

struct ProgressView: View {
   
   var body: some View {
       ZStack {
           Circle()
           .stroke(linewidth: 40)
           .foregroundColor(.blue)
               Text("25%")
       }
   }
   
}

PlaygroundPage.current.setLiveView(ProgressView().padding(150))

解决方法

这很可能是一个错误 - 我提交了反馈 #FB9092837。但是在 Apple 修复它之前,添加硬编码的 .frame 可以作为一种hacky 修复。

.frame(width: 500,height: 500)

但是,加载需要一段时间......它首先在左上角渲染,几秒钟后移动到中心。

GIF of the long loading time

我发现如果您将 ProgressView 放在另一个容器视图中,并将框架设置在那里,速度会快得多。

GIF of the much faster loading time

代码如下:

import SwiftUI
import PlaygroundSupport

struct ProgressView: View {
    var body: some View {
        ZStack {
            Circle()
                .stroke(lineWidth: 40)
                .foregroundColor(.blue)
            Text("25%")
        }
    }
}

struct ContainerView: View {
    var body: some View {
        ProgressView()
            .frame(width: 500,height: 500)
    }
}

PlaygroundPage.current.setLiveView(ContainerView())