UIBezierpaths не рисуют, где они были нарисованы - PullRequest
0 голосов
/ 24 сентября 2018

Нужна помощь по этой «странной» проблеме.

Я использую PanGesture, чтобы позволить пользователю нарисовать линию на CAShapeLayer.

Я отслеживаю путь доони заканчиваются и затем сохраняют путь в массиве путей, очищая их исходный путь от CAShapeLayer.path

Когда я перерисовываю эти пути в 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
  }

вт 25 сен, 2018

Я создал мини-проект, который содержит только биты и кусочки импорта.Это доступно здесь ... Мини-проект

1 Ответ

0 голосов
/ 27 сентября 2018

Я думаю, у вас есть способы, чтобы заставить все работать так, как нужно, но, чтобы решить вашу начальную проблему "смещения" ...

В 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
    ...

Теперь ваши координаты панорамирования будут совпадать с координатами содержащегося изображения.

Как я уже сказал, у вас все еще есть пути, нонадеюсь, это поможет вам на этом пути.

...