Вдохновленный tutsline Я реализовал свой собственный класс просмотра лупы Swift 4, чтобы удовлетворить наши потребности, который работает довольно хорошо, за исключением двух вариантов использования.
Мы используемлупа для увеличения содержимого UIImageView.
- Лупа отображает черное содержимое, когда касание начинается в области
UIImageView
, где в
* нет изображения1011 *
Когда касание покидает область, где находилось изображение, лупа повторяет отображение последнего видимого содержимого
Код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!)
}
}
Может ли кто-нибудь объяснить мне, как избежать рендеринга «без контента» в контексте?Есть ли способ проверить, есть ли визуализируемый контент?
Это изображение того, как оно выглядит, когда в месте касания находится контент, который может быть визуализирован:
РЕДАКТИРОВАТЬ: Поскольку Тоби хотел знать, как я использую 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()
}
}