我正在使用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表示图形中存在空间。

提前致谢!!

ios - 连续绘图不会发生UITouch的touchMoved-LMLPHP

最佳答案

你能指望什么?检查图像的画框是否为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条件下的逻辑是,只要从一个边界到另一个边界的点的投影具有相反的方向,该点仍将位于两个边界点之间,并且需要绘制图像。我还没有测试过。

10-08 05:22