我正在使用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,则绘图中存在空间。
提前致谢!!
答案 0 :(得分:0)
你期待什么?检查图像的图纸框架为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条件中的逻辑是,只要从一个边到另一个边的点的投影具有相反的方向,该点仍然在两个边界点之间并且需要绘制图像。我没有测试过它。