ios - 为视图实现 UIPanGestureRecognizer 时,触摸绘图不起作用
问题描述
我有屏幕来测试带有弹出气泡的设备触摸屏。并且为它们添加了一些由交叉组成的气泡的子视图中的 imageView。然后用户在气泡上滑动以检查触摸屏。
我想在同一个视图上绘图。当用户在气泡上滑动手指时,将绘制一条线。我有单独的绘图类并将其分配给控制器的主父视图。
如果我删除 UIPanGestureRecognizer 的代码,那么绘图工作并且没有滞后。如果我添加手势来查看像这样弹出气泡
view.addGestureRecognizer(gestureRecognizer)
然后有一个滞后,绘图不起作用。
我想要两个东西,比如弹出气泡和在视图中绘图。这个手势的主要问题是当我在视图中添加它时,绘图工作没有任何延迟,但弹出气泡不起作用。
let gestureRecognizer : UIPanGestureRecognizer = UIPanGestureRecognizer(target: self, action: #selector(panGestureRecognized(_:)))
gestureRecognizer.maximumNumberOfTouches = 1
gestureRecognizer.minimumNumberOfTouches = 1
view.addGestureRecognizer(gestureRecognizer)
图纸视图类
import UIKit
class DrawingView: UIView {
var drawColor = UIColor.black
var lineWidth: CGFloat = 5
private var lastPoint: CGPoint!
private var bezierPath: UIBezierPath!
private var pointCounter: Int = 0
private let pointLimit: Int = 128
private var preRenderImage: UIImage!
// MARK: - Initialization
override init(frame: CGRect) {
super.init(frame: frame)
initBezierPath()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
initBezierPath()
}
func initBezierPath() {
bezierPath = UIBezierPath()
bezierPath.lineCapStyle = CGLineCap.round
bezierPath.lineJoinStyle = CGLineJoin.round
}
// MARK: - Touch handling
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
let touch: AnyObject? = touches.first
lastPoint = touch!.location(in: self)
pointCounter = 0
}
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
let touch: AnyObject? = touches.first
let newPoint = touch!.location(in: self)
bezierPath.move(to: lastPoint)
bezierPath.addLine(to: newPoint)
lastPoint = newPoint
pointCounter += 1
if pointCounter == pointLimit {
pointCounter = 0
renderToImage()
setNeedsDisplay()
bezierPath.removeAllPoints()
}
else {
setNeedsDisplay()
}
}
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
pointCounter = 0
renderToImage()
setNeedsDisplay()
bezierPath.removeAllPoints()
}
override func touchesCancelled(_ touches: Set<UITouch>?, with event: UIEvent?) {
touchesEnded(touches!, with: event)
}
// MARK: - Pre render
func renderToImage() {
UIGraphicsBeginImageContextWithOptions(self.bounds.size, false, 0.0)
if preRenderImage != nil {
preRenderImage.draw(in: self.bounds)
}
bezierPath.lineWidth = lineWidth
drawColor.setFill()
drawColor.setStroke()
bezierPath.stroke()
preRenderImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
}
// MARK: - Render
override func draw(_ rect: CGRect) {
super.draw(rect)
if preRenderImage != nil {
preRenderImage.draw(in: self.bounds)
}
bezierPath.lineWidth = lineWidth
drawColor.setFill()
drawColor.setStroke()
bezierPath.stroke()
}
// MARK: - Clearing
func clear() {
preRenderImage = nil
bezierPath.removeAllPoints()
setNeedsDisplay()
}
// MARK: - Other
func hasLines() -> Bool {
return preRenderImage != nil || !bezierPath.isEmpty
}
}
解决方案
推荐阅读
- python - mysql-connector-python 导入的问题
- python - 查找从 1 个数组拆分的 2 个子数组的最大乘积
- python - 你可以用python打开命令提示符吗?
- javascript - 不和谐反应角色问题
- reactjs - 带有 Expo + 反应导航 5 的 Firebase 身份验证流程
- python - pip install 无法识别以前安装的软件包
- browserify - 尝试浏览化超群库以从浏览器连接到主题
- c# - Automapper C# Net Core - 如何映射两个不同结构的列表来更改一个字段的值?
- html - 将鼠标悬停在另一个div中的元素上时如何在一个div中显示元素
- javascript - 访问对象内数组中的数据