iOS10 Swift 3 – 简单绘图canvas

我正在使用Swift 3构建一个iOS应用程序,我的应用程序中有一个部分,我想要两个“在这里签名”字段,这将是canvas。 只有一种颜色(黑色)和一个“重置”按钮。

到目前为止,我已经看过这个教程 ,它是在旧版本的Swift上,但有人将其更新为Swift 3, 这里是代码。

我复制粘贴在ViewController.swift文件中的所有内容,但我注释掉了最后两个函数override func prepareViewController:SettingsViewControllerDelegate因为我不需要那些。

它按预期工作,笔画得到保存。

但是,我现在有2个问题:

  1. 线条绘制在触摸点的右侧。
  2. 我不确定如何让它适用于另一组图像视图。

正如您在此处的图像中所看到的,由于某种原因,绘制的线条显示在我光标所在的右侧。 转换的原始代码不是这种情况:

在此处输入图像描述

我现在无法在实际设备上测试这个。 但这种奇怪的行为不是转换后的原始代码。

我的另一个问题是这就是代码似乎如何工作:

 detect touch -> draw on imageview 

如果这是方法,那么如果只有一个触摸,我应该如何处理两个imageView?

我认为该方法应该是从UIView扩展一个类来覆盖draw函数。 我在这看到一个这样的代码。 然而,它写在旧的Swift上,我不知道如何翻译或更新它。 我尝试使用XCode的“自动更正”function,但我遇到了障碍。

所以现在,我有两个需要帮助的问题。 任何回答都会非常有帮助。

  1. 处理光标与实际绘制线的位置之间的“偏移”,以及如何处理多于1幅canvas。

  2. 将此代码转换为Swift 3

得到它了。 我将DrawableView类转换为Swift 3。

请指出,如果我做了任何错误,会导致应用程序因延长使用w / e而崩溃。

 class DrawableView: UIView { let path=UIBezierPath() var previousPoint:CGPoint var lineWidth:CGFloat=1.0 // Only override drawRect: if you perform custom drawing. // An empty implementation adversely affects performance during animation. override init(frame: CGRect) { previousPoint=CGPoint.zero super.init(frame: frame) } required init?(coder aDecoder: NSCoder) { previousPoint=CGPoint.zero super.init(coder: aDecoder) let panGestureRecognizer=UIPanGestureRecognizer(target: self, action: #selector(pan)) panGestureRecognizer.maximumNumberOfTouches=1 self.addGestureRecognizer(panGestureRecognizer) } override func draw(_ rect: CGRect) { // Drawing code UIColor.green.setStroke() path.stroke() path.lineWidth=lineWidth } func pan(panGestureRecognizer:UIPanGestureRecognizer)->Void{ let currentPoint=panGestureRecognizer.location(in: self) let midPoint=self.midPoint(p0: previousPoint, p1: currentPoint) if panGestureRecognizer.state == .began{ path.move(to: currentPoint) } else if panGestureRecognizer.state == .changed{ path.addQuadCurve(to: midPoint,controlPoint: previousPoint) } previousPoint=currentPoint self.setNeedsDisplay() } func midPoint(p0:CGPoint,p1:CGPoint)->CGPoint{ let x=(p0.x+p1.x)/2 let y=(p0.y+p1.y)/2 return CGPoint(x: x, y: y) } }