【问题标题】:Drawing on a UIImageView inside a UIScrollView在 UIScrollView 内的 UIImageView 上绘图
【发布时间】:2018-04-04 08:49:44
【问题描述】:

我在UIScrollView 中有一个UIImageView,它会自动缩小以适应提供的图像。用户可以像往常一样使用捏合手势进行缩放,并且平移手势设置为需要两次触摸,因为绘图优先。

在启动时,一切看起来都很棒,但是当我调用我的绘图代码时,会发生这种情况:

如您所见,当调用 drawLineFrom(fromPoint:toPoint:) 时,UIImageView 会缩小。之后,绘图似乎按预期工作(尽管每次触摸都会跳过线条的第一部分)。

我的UIPanGestureRecognizer 选择器:

@objc func onOneFingerDrawing(_ sender: UIPanGestureRecognizer) {
    switch sender.state {
    case .began:
        swiped = false

        lastPoint = sender.location(in: drawView.imageView)
    case .changed:
        swiped = true

        let currentPoint = sender.location(in: drawView.imageView)
        drawLineFrom(fromPoint: lastPoint, toPoint: currentPoint)

        lastPoint = currentPoint
    case .ended:
        guard drawView.scrollView.frame.contains(sender.location(in: drawView.imageView)) else {
            return
        }

        if let newImage = drawView.imageView.image {
            if history.count > historyIndex + 1 {
                history.removeLast((history.count - 1) - historyIndex)
            }

            history.append(newImage)
            historyIndex = history.count - 1
        }
    case .possible,
         .cancelled,
         .failed:
        return
    }
}

还有我的drawLineFrom(fromPoint:toPoint:):

@objc func drawLineFrom(fromPoint: CGPoint, toPoint: CGPoint) {
    UIGraphicsBeginImageContextWithOptions(drawView.imageView.frame.size, false, UIScreen.main.scale)
    let context = UIGraphicsGetCurrentContext()
    context?.interpolationQuality = .none

    drawView.imageView.image?.draw(in: CGRect(x: 0, y: 0, width: drawView.imageView.frame.size.width, height: drawView.imageView.frame.size.height))

    context?.move(to: fromPoint)
    context?.addLine(to: toPoint)

    context?.setLineCap(.round)
    context?.setLineWidth(lineWidth)
    context?.setStrokeColor(lineColor)
    context?.setBlendMode(blendMode)

    context?.strokePath()

    let newImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    drawView.imageView.image = newImage
}

【问题讨论】:

  • 每次拖动时都会创建图像,因为每次手势更改都会调用 drawLineFrom 并且每次都会更改图像
  • 你有没有想过这个问题?我有一个非常相似的问题。我的绘图会在缩放的区域绘制,但是当我抬起手指时,绘图会移动到左上角。

标签: ios swift drawing core-graphics


【解决方案1】:

滚动视图的图像约束存在问题。每当您开始渲染图像时,它的框架就会根据内容发生变化。因此,您需要向图像视图添加纵横比约束(就像我所做的那样)或任何大小约束。请参阅 GIF 以供参考。

在添加图像视图大小约束之前。

添加图像视图大小约束后。

【讨论】:

  • 不是比例问题。正如您在我的 gif 中看到的那样,图像比例保持不变,但缩放比例正在上升 - 我认为
  • 我的意思是,在滚动视图中为您的图像视图添加适当的大小约束。
【解决方案2】:

由于您使用的是UIPanGestureRecognizer,因此绘图会跳过该行的第一部分。他们的系统在向您发送.began 事件之前首先确定它是一个平底锅。你应该把它换成一个通用的UIGestureRecognizer 让它立即启动。在这种情况下,您需要添加额外的逻辑来检查手指的移动和数量。

就调整大小而言,没有更多信息很难说。我也会为 ImageView 的背景着色。第一个问题是,是整个 imageView 都在缩小,还是只是其中的实际图像。

【讨论】:

  • 是的,但是因为正在调整大小的是整个 imageView,所以它不显示。
猜你喜欢
  • 2016-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多