You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 23:35:18