ios - UIBezierpaths 没有在它们被绘制的地方绘制
问题描述
在这个“奇怪”的问题上寻求帮助。
我正在使用 PanGesture 允许用户在CAShapeLayer
.
我跟踪路径直到它们结束,然后将路径存储在路径数组中,从CAShapeLayer.path
当我将这些路径重绘到 a 上UIImage
时,这些路径会移向Y-axis
屏幕顶部。
我附上两张图片:
1)路径的绘制。绘制路径
2)重绘路径时弹出的UIImage。如您所见,我沿着网格线绘制,但是,当创建 UIImage 时,该线位于网格线上方。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
}
2018 年 9 月 25 日星期二
我创建了一个仅包含导入点点滴滴的迷你项目。它在这里可用...迷你项目
解决方案
我认为你有办法让一切按预期工作,但是,要解决你最初的“偏移”问题......
在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
为 shift 将非常明显,并且会更容易看出它与大小差异的关系。
您可能想要做的是将框架的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
...
现在,您的平移坐标将匹配所包含图像的坐标。
正如我所说,您还有很长的路要走,但希望这对您有所帮助。
推荐阅读
- generics - 将通用 Java 回调转换为 Kotlin 时的可空性
- eloquent - Laravel 5.8 中 hasMany 关系的条件
- java - 有没有办法为 hadoop-hdfs 3.2.1 jar 覆盖 log4j 1.2.17 到 log4j2 的传递依赖
- reactjs - React - 未知道具,即使它们存在于响应中
- apache-spark - 如何查看在 kubernetes 中运行的 Livy 中的执行程序日志
- javascript - 获取 html 数据属性的值后,如何将唯一值传递给可迭代对象
- java - 如何等待线程池完成所有任务?
- c++ - 如何覆盖 qHash() 函数?
- node.js - 嵌套循环同步还是异步?
- node.js - 使用 firebase 函数和 express 连接到 socket.io 的问题