Делать layer.render (в контексте :) только тогда, когда есть что визуализировать - PullRequest
0 голосов
/ 18 октября 2018

Вдохновленный tutsline Я реализовал свой собственный класс просмотра лупы Swift 4, чтобы удовлетворить наши потребности, который работает довольно хорошо, за исключением двух вариантов использования.

Мы используемлупа для увеличения содержимого UIImageView.

  1. Лупа отображает черное содержимое, когда касание начинается в области UIImageView, где в
* нет изображения1011 *enter image description here Когда касание покидает область, где находилось изображение, лупа повторяет отображение последнего видимого содержимого

enter image description here

Кодdraw(_ rect:) метод выглядит следующим образом:

    // Called by the didSet of touchPoint and the ios view lifecylce
    override public func draw(_ rect: CGRect) {

        super.draw(rect)

        guard let magnifyingView = viewToMagnify else { fatalError("class WWMagnifierView seems to be used without having set a view to magnify.") }

        if touchPoint != CGPoint.zero {

            let context = UIGraphicsGetCurrentContext()

            context!.translateBy(x: 1 * (self.frame.size.width * 0.5), y: 1 * (self.frame.size.height * 0.5))
            context!.scaleBy(x: 1.5, y: 1.5) // 1.5 is the zoom scale
            context!.translateBy(x: -1 * (touchPoint.x), y: -1 * (touchPoint.y))

            magnifyingView.layer.render(in: context!)
        }
    }

Может ли кто-нибудь объяснить мне, как избежать рендеринга «без контента» в контексте?Есть ли способ проверить, есть ли визуализируемый контент?

Это изображение того, как оно выглядит, когда в месте касания находится контент, который может быть визуализирован:

enter image description here

РЕДАКТИРОВАТЬ: Поскольку Тоби хотел знать, как я использую MagnifierView ...

// Setup getting called in viewDidAppear to ensure the magnifier works also, when the view appears again on stack.
func setupMagnifier() {

    guard let imageView = imageView else { return }

    if magnifier == nil {

        magnifier = WWMagnifierView(frame: CGRect(x: 30, y: 130, width: 120, height: 120))

        self.view.addSubview(magnifier!)
    }

    magnifier?.viewToMagnify = imageView
}

// Gets triggered from the touch events
func updateMagnifier(for touchLocation: CGPoint) {

    // Update the magnifiers content based on the touch location
    magnifier?.touchPoint = touchLocation
}

Настройка touchPoint здесь вызывает закрытие didSetтогда ...

public var touchPoint = CGPoint.zero {

    didSet {

        self.setNeedsDisplay()
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...