在此“怪异”问题上寻求帮助。
我正在使用PanGesture允许用户在CAShapeLayer
上画一条线。
我一直跟踪路径,直到它们结束,然后将路径存储在路径数组中,并从CAShapeLayer.path
清除其原始路径
当我将这些路径重绘到UIImage
上时,这些路径在Y-axis
中向屏幕顶部移动。
我要附加两个图像:
1)绘制路径。 Drawing The Path
2)当我重画路径时放出的UIImage。如您所见,我沿着网格线绘制,但是,当创建UIImage时,该线在网格线上方。 The Path Redrawn On UIImage
任何建议表示赞赏。
图形和渲染的代码在下面。
@objc private func drawLine(_ gestureRecognizer: UIPanGestureRecognizer) {
let point = gestureRecognizer.location(in: self)
if point.x < 0 || point.x > self.bounds.width || point.y < 0 || point.y > self.bounds.height {
return
}
switch gestureRecognizer.state {
case .began:
currentLine = UIBezierPath()
currentLine.lineWidth = settings.defaultSpotRadius
currentLine.lineCapStyle = .round
currentLine.lineJoinStyle = .round
currentLine.move(to: point)
break
case .changed:
currentLine.addLine(to: point)
currentLineDrawLayer.path = currentLine.cgPath
break
case .ended:
self.storage.addLine(clear: fowClearMode, path: currentLine, ofWidth: currentLine.lineWidth)
currentLineDrawLayer.path = nil
storedImage = drawPaths()
break
default:
break
}
}
public func drawPaths() -> UIImage? {
if pathsHidden { return nil }
let rect = CGRect(origin: .zero, size: self.imageSize)
UIGraphicsBeginImageContextWithOptions(rect.size, false, 0.0)
storedImage.draw(in: rect)
for (isClear, line, width) in thePaths {
let blendMode = isClear ? settings.colorClear : settings.colorDark
line.lineWidth = width
line.stroke(with: blendMode, alpha: 1.0)
}
let image = UIGraphicsGetImageFromCurrentImageContext()!
UIGraphicsEndImageContext()
return image
}
我创建了一个仅包含导入位和片段的微型项目。在这里可用... Mini-Project
答案 0 :(得分:0)
我认为您有一种方法可以使所有功能按预期工作,但是可以解决您最初的“偏移”问题...
在ViewController.swift
中,您将imgDisplay: ImageDisplay
的帧设置为self.view.bounds
---在这种情况下将为1024 x 768
。
然后在ImageDisplay.swift
中以aPathImage
的大小创建1024 x 791
并将该图像设置为子层。
然后...
您正在基于边界为1024 x 768
的视图跟踪手势,然后在1024 x 791
的图像上重新绘制这些线条,从而导致“移位”。
请注意,如果您将图像尺寸更改为800 x 600
,则变化将非常明显,并且可以轻松看出它与尺寸差异之间的关系。
您可能想做的就是将imgDisplay
的帧的大小设置为图像的大小。
尝试此操作以查看会发生什么-在ImageDisplay.swift
中:
override init(frame: CGRect) {
super.init(frame: frame)
// add this line
self.frame = CGRect(origin: .zero, size: aPathImage.sizeCurrent)
self.contentMode = .center
...
现在,您的平移坐标将与所包含图像的坐标匹配。
正如我所说,您仍有路要走,但是希望这对您有帮助。