iOS10 Swift 3 - 简单绘图画布
问题描述:
我正在使用Swift 3构建iOS应用程序,并且在我的应用程序中有一部分需要两个“签入此处”字段,这将成为画布。只会有一种颜色(黑色)和一个“重置”按钮。iOS10 Swift 3 - 简单绘图画布
到目前为止,我已经看到了this tutorial,它是在一个旧版本的雨燕,但有人更新,以斯威夫特3,here is the code.
我复制粘贴一切都在ViewController.swift
文件,但我注释掉最后两个功能override func prepare
和ViewController:SettingsViewControllerDelegate
因为我不需要这些。
它按预期工作,笔画被保存。
不过,我有2个问题,它现在:
- 线被描绘为触摸点的权利。
- 我不确定如何使其适用于另一组图像浏览。
正如你在这里看到的,由于某种原因,画出的线出现在我有光标的地方。这种行为是不是为转换的原始代码的情况:
我无法现在来测试这个在实际设备上。但是这种奇怪的行为不在转换后的原始代码上。
另一个值得关注的我是,这是怎样的代码似乎工作:
detect touch -> draw on imageview
如果是这种方法,那么我应该如何处理两个imageViews如果任何触摸将借鉴只是一个?
我认为这个方法应该是从UIView中扩展一个类来覆盖draw函数。我看到一个这样的代码here.然而,它是在旧的Swift上编写的,我不知道如何翻译或更新它。我尝试使用XCode的“自动更正”功能,但我遇到了障碍。
所以现在,我有两个问题需要帮助。任何答案都会很有帮助。
处理光标与实际绘制线的位置之间的“偏移”,以及如何处理超过1个画布。
任何帮助和指导将非常感激。
答
明白了。我将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)
}
}