Xcode 14.1中SwiftUI的PencilKit模拟器笔触消失问题求助
解决Xcode 14.1中SwiftUI+PencilKit模拟器/预览笔触消失问题
Xcode 14.1存在已知bug:在SwiftUI中使用PKCanvasView时,模拟器和预览内绘制的笔触会消失,但真机运行正常。以下是几个可行的解决方案,用于改善调试体验:
方案1:回退到Xcode 14.0.1版本
直接降级到Xcode 14.0.1是最省心的解决方式,该版本的模拟器和预览功能对PencilKit的支持正常,能完全恢复预期的调试体验。
方案2:给PKCanvasView添加固定尺寸约束
模拟器中笔触消失的原因之一是视图布局刷新导致PKCanvasView的绘制层被重置,给视图添加明确的尺寸约束可以缓解这个问题:
修改SwiftUI层的视图尺寸
struct ContentView: View { var body: some View { PKCanvasRepresentation() .frame(minWidth: 300, minHeight: 400) // 添加固定尺寸 } }
或者在UIViewRepresentable中设置初始frame
func makeUIView(context: Context) -> PKCanvasView { let canvas = PKCanvasView(frame: CGRect(x: 0, y: 0, width: 300, height: 400)) canvas.drawingPolicy = .anyInput return canvas }
方案3:手动保存并恢复绘制内容
通过监听PKCanvasView的绘制变化,持久化保存绘制数据,在视图更新时恢复,避免布局刷新导致的笔触丢失:
import SwiftUI import PencilKit struct ContentView: View { var body: some View { PKCanvasRepresentation() } } struct PKCanvasRepresentation : UIViewRepresentable { @State private var savedDrawing = PKDrawing() func makeUIView(context: Context) -> PKCanvasView { let canvas = PKCanvasView() canvas.drawingPolicy = .anyInput canvas.delegate = context.coordinator canvas.drawing = savedDrawing return canvas } func updateUIView(_ uiView: PKCanvasView, context: Context) { if !uiView.drawing.bounds.size.equalTo(savedDrawing.bounds.size) || uiView.drawing != savedDrawing { uiView.drawing = savedDrawing } } func makeCoordinator() -> Coordinator { Coordinator(self) } class Coordinator: NSObject, PKCanvasViewDelegate { var parent: PKCanvasRepresentation init(_ parent: PKCanvasRepresentation) { self.parent = parent } func canvasViewDrawingDidChange(_ canvasView: PKCanvasView) { parent.savedDrawing = canvasView.drawing } } } struct ContentView_Previews: PreviewProvider { static var previews: some View { ContentView() } }
以上方案中,降级版本适合长期稳定调试,添加尺寸约束适合快速临时修复,保存绘制数据则适合需要保留绘制状态的场景。
内容的提问来源于stack exchange,提问作者jakob witsch
相关产品推荐
相关产品推荐

