如何在视图控制器之间传输 Xcode 8 上的绘图?

Posted

技术标签:

【中文标题】如何在视图控制器之间传输 Xcode 8 上的绘图?【英文标题】:How to transfer a drawing on Xcode 8 between view controllers? 【发布时间】:2018-01-08 16:32:15 【问题描述】:

我正在尝试制作这个应用程序,我在一个视图控制器上绘图,然后我转到另一个视图控制器并在那里也有相同的绘图。我一直在到处寻找,但没有发现任何关于在视图控制器之间传输绘图的信息。我是一名高中生,并且是使用任何编码的初学者,尤其是使用 Xcode 8 和 Swift 3。我将不胜感激您提供的任何提示。谢谢! :)

更新:所以我在一个视图控制器上的 UIimage 上绘图,并尝试将相同的绘图放到另一个视图控制器上只是为了显示,它不需要在传输后进行编辑。

这是我必须在 UIimage 上绘制的所有代码

@IBOutlet weak var imageViewPass: UIImageView!

var lastPoint = CGPoint.zero
var swiped = false
var red:CGFloat = 0.0
var green:CGFloat = 0.0
var blue:CGFloat = 0.0

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?)

    swiped = false

    if let touch = touches.first 
        lastPoint = touch.location(in: self.view)
    


func drawlines(fromPoint:CGPoint,toPoint:CGPoint)

    UIGraphicsBeginImageContext(self.view.frame.size)
    drawOnIMageFeet.image?.draw(in: CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.height))

    let context = UIGraphicsGetCurrentContext()

    context?.move(to: CGPoint(x: fromPoint.x, y: fromPoint.y))
    context?.addLine(to: CGPoint(x: toPoint.x, y: toPoint.y))

    context?.setBlendMode(CGBlendMode.normal)
    context?.setLineCap(CGLineCap.round)
    context?.setLineWidth(5)
    context?.setStrokeColor(UIColor(red: red, green: green, blue: blue, alpha: 1.0).cgColor)

    context?.strokePath()

    drawOnIMageFeet.image = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()


override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?)

    swiped = true

    if let touch = touches.first 
        let currentPoint = touch.location(in: self.view)
        drawlines(fromPoint: lastPoint, toPoint: currentPoint)

        lastPoint = currentPoint
    

override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?)

    if !swiped 
        drawlines(fromPoint: lastPoint, toPoint: lastPoint)
    


    @IBAction func pickColor(_ sender: UIButton)

    if sender.tag == 0 
        (red,green,blue) = (1,0,0)
     else if sender.tag == 1 
        (red,green,blue) = (0,1,0)
     else if sender.tag == 2 
        (red,green,blue) = (0,0,1)
     else if sender.tag == 3 
        (red,green,blue) = (1,0,1)
     else if sender.tag == 4 
        (red,green,blue) = (1,1,0)
     else if sender.tag == 5 
        (red,green,blue) = (0,1,1)
     else if sender.tag == 6 
        (red,green,blue) = (0,0,0)
    

【问题讨论】:

欢迎来到 Stack Overflow!请edit您的问题显示the code you have so far。您应该至少包含您遇到问题的代码的大纲(但最好是minimal reproducible example),然后我们可以尝试帮助解决具体问题。您还应该阅读How to Ask。 您想将其存储到属性中,我会说 UIImage,但我不知道绘图是如何制作的。然后你应该把它作为参数发送到新的 ViewController 首先请显示您已经尝试过的代码。您如何执行此操作取决于您要对绘图信息做什么以及如何绘制它。如果您只想将其作为图像显示,那么您可以按照建议进行操作并将其转换为 UIImage 但是如果您希望能够操作它,那么您需要存储所需的信息(数据点)创建图像。 @TobySpeight 我添加了我所有的代码,如果你能尽快回复,那就太棒了 @ZuzanaPaulis 你把它作为参数发送是什么意思? 【参考方案1】:

使用 segue 时将数据传输到另一个视图控制器相对简单。当即将发生转换时,会在当前视图控制器上调用prepare(for:sender:) 函数(查看docs)。

假设drawOnIMageFeet 是您当前视图控制器的一个属性,该函数可能看起来像这样:

func prepare(for segue:UIStoryboardSegue, sender:Any?)

    // vc will be the view controller that will be displayed after the transition
    if let vc = segue.destination as? MyNextViewController
    
        // do your transferring of data/setup here
        vc.imageToDraw = drawOnIMageFeet

        // other setup
    

对于来自单个视图控制器的多个 segue,我通常只是根据哪个视图控制器类是目标来确定要做什么。但是,如果您有多个不同的转场从一个视图控制器进入另一个,您可以使用UIStoryboardSegue 类的identifier 属性来进一步区分转场。

【讨论】:

问题是我在当前视图控制器/drawOnImageFeet上绘制的绘图不会出现在第二个视图控制器中 也许我并没有我想的那么清楚。绘图发生在视图中,视图包含所谓的视图层次结构中的其他子视图。每个视图控制器都有自己的视图层次结构,它们与其他视图控制器的视图完全分开,因此您在第一个视图控制器的视图中绘制的内容需要传输到第二个视图控制器,以便它可以在自己的视图中绘制它.转移是通过我上面解释的功能完成的。一旦第二个视图控制器有了绘制的图像,它仍然需要在其视图中显示图像(在UIImageView 中显示)。

以上是关于如何在视图控制器之间传输 Xcode 8 上的绘图?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Xcode 8 上的自动布局调整对象的大小以适应不同的屏幕尺寸?

如何使完全透明视图上的绘图可见

Xcode Swift - 在视图控制器之间传递按钮路径数据

如何以编程方式在 Xcode 中的视图控制器之间移动用户?

如何在 XCode 8 中将视频添加到视图控制器?

在绘图应用程序中分离模型和视图/控制器