我正在使用UIKit绘制图像图案,当我快速绘制线条时,在UITouch的委托中连续未收到它的调用。
这是我正在使用的代码
var tempImageView : UIImageView!
var patternImage = UIImage(named: "xxx.png")!
var brushWidth : CGFloat = 50.0
var opacity : CGFloat = 1.0
var lastPoint = CGPoint.zero
UITouches的代表
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
super.touchesBegan(touches, with: event)
if let touch = touches.first {
lastPoint = touch.location(in: self)
}
}
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
super.touchesMoved(touches, with: event)
if let touch = touches.first {
let currentPoint = touch.location(in: self)
drawLine(fromPoint: lastPoint, toPoint: currentPoint)
lastPoint = currentPoint
}
}
从图像上绘制图案
func drawLine(fromPoint:CGPoint, toPoint:CGPoint) {
UIGraphicsBeginImageContext(self.frame.size)
let context = UIGraphicsGetCurrentContext()
tempImageView.image?.draw(in: self.bounds)
context?.draw(patternImage.cgImage!, in: CGRect(x: fromPoint.x , y: fromPoint.y, width:brushWidth , height:brushWidth))
tempImageView.image = UIGraphicsGetImageFromCurrentImageContext()
tempImageView.alpha = opacity
UIGraphicsEndImageContext()
}
任何人都可以帮助我解决此问题。
如果两次连续触摸之间的差异更大,则brushWidth表示图形中存在空间。
提前致谢!!
最佳答案
你能指望什么?检查图像的画框是否为CGRect(x: fromPoint.x , y: fromPoint.y, width:brushWidth , height:brushWidth)
。您的drawLine
甚至没有使用toPoint
参数。
它还缺少旋转等所有功能。您也许可以通过应用一些矩阵来改善结果,但是从您似乎试图实现的目标出发,最好找到一个更好的工具。也许您可以像这样迭代:
var point = fromPoint
let direction = CGPointNormalize(CGPointMinus(toPoint-fromPoint))
while CGPointDot(CGPointMinus(point-fromPoint), direction)*CGPointDot(CGPointMinus(point-toPoint), direction) <= 0.0 {
drawLineSegment(at: point) // This is the same method you already have without that other unused parameter
point = CGPointPlus(point, direction)
}
大概该代码应该在起点绘制图像,然后向终点移动1个“像素”,然后再次绘制并重复此操作,直到到达目的地为止。该方法应易于编写并理解
CGPoint
操作。至于逻辑:它从
toPoint
找到朝向fromPoint
的方向并朝该方向移动。 while条件下的逻辑是,只要从一个边界到另一个边界的点的投影具有相反的方向,该点仍将位于两个边界点之间,并且需要绘制图像。我还没有测试过。