首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PencilKit in SwiftUI

PencilKit in SwiftUI
EN

Stack Overflow用户
提问于 2019-12-20 18:53:36
回答 2查看 3.2K关注 0票数 0

我试图在SwiftUI中使用SwiftUI。

  1. 如何在updateUIView-function中检测到哪个Binding-variable已被更新?例如,我不想在更改颜色时清除画布。

  1. ,还有比切换布尔值更好的清除画布的方法吗?切换布尔值会强制updateUIView-function执行.

代码语言:javascript
复制
import SwiftUI
import UIKit
import PencilKit

struct ContentView: View {
    @State var color = UIColor.black
    @State var clear = false

    var body: some View {
        VStack{
            PKCanvas(color: $color, clear:$clear)
            VStack(){
                Button("Change to BLUE"){ self.color = UIColor.blue }
                Button("Change to GREEN"){ self.color = UIColor.green }
                Button("Clear Canvas"){ self.clear.toggle() }
            }
        }
    }
}

struct PKCanvas: UIViewRepresentable {
    class Coordinator: NSObject, PKCanvasViewDelegate {
        var pkCanvas: PKCanvas

        init(_ pkCanvas: PKCanvas) {
            self.pkCanvas = pkCanvas
        }
    }

    @Binding var color:UIColor
    @Binding var clear:Bool

    func makeCoordinator() -> Coordinator {
        Coordinator(self)
    }

    func makeUIView(context: Context) -> PKCanvasView {
        let canvas = PKCanvasView()
        canvas.tool = PKInkingTool(.pen, color: color, width: 10)

        canvas.delegate = context.coordinator
        return canvas
    }

    func updateUIView(_ canvasView: PKCanvasView, context: Context) {
        // clears the canvas
        canvasView.drawing = PKDrawing()

        // sets a new color
        canvasView.tool = PKInkingTool(.pen, color: color, width: 10)
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-12-20 19:03:37

这将起到以下作用:

代码语言:javascript
复制
    func updateUIView(_ canvasView: PKCanvasView, context: Context) {
        if clear != context.coordinator.pkCanvas.clear{
            canvasView.drawing = PKDrawing()
        }
        canvasView.tool = PKInkingTool(.pen, color: color, width: 10)
    }
票数 2
EN

Stack Overflow用户

发布于 2019-12-20 19:23:58

我多次观察到类似的模式,在这里我们得到了SwiftUI-value-declarative-state-managed世界和xKit-OOP-imperative-action-managed世界之间的相互交流.有人试图把所有的东西从一个放到另一个,反之亦然.

我有一个想法,也许最好是为每一个人保留每一种天性,并在两者之间有一些调解人或演员.因此,对于您的用例,我会认为我会采取不同的方式,比如说(为了考虑而不是测试):

代码语言:javascript
复制
struct ContentView: View {
    //@State var color = UIColor.black // < both these have nothing to ContentView
    //@State var clear = false

    let pkActor = PKCanvasActor() // < mediator, reference type

    var body: some View {
        VStack{
            PKCanvas(actor: pkActor)
            VStack(){
                Button("Change to BLUE"){ self.pkActor.use(color: UIColor.blue) }
                Button("Change to GREEN"){ self.pkActor.use(color: UIColor.green) }
                Button("Clear Canvas"){ self.pkActor.clear() }
            }
        }
    }
}

在这里的某处

代码语言:javascript
复制
func makeUIView(context: Context) -> PKCanvasView {
    let canvas = PKCanvasView()
    self.actor.canvas = canvas // but think to avoid cycle reference

和纯OOP部分

代码语言:javascript
复制
class PKCanvasActor {
  var canvas: PKCanvasView

   func use(color: Color) {
      // do anything with canvas color
   }

   func clear() {
      canvas.drawing = PKDrawing()
   }

   // ... any more actions 
}

当然,我为SwiftUI Button interact with Map中的类似场景提出了一种简单的方法.但上面的方式对我来说更可取。

备注:有人可能会说协调员就是为了这个目的,但是它的生命周期是由SwiftUI内部管理的,它参与了这些内部工作流程,所以我会避免干涉这些关系.

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59430099

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档