Проблема с быстрым увеличением изображения - изображение глючит
Я пытаюсь сделать лупу для UIImageView
, Идея проста: у меня есть UIView
подкласс из MagnifyingView
, Это представление статично расположено внизу экрана и появляется, когда пользователь "рисует" пальцем. У меня есть несколько инструментов, таких как лассо, ластик и инструменты восстановления, где пользователь хочет иметь больше контроля над тем, как он рисует
Вот MagnifyingView
код:
import UIKit
fileprivate extension UIView {
fileprivate var _width_:CGFloat {
get { return self.frame.size.width }
}
fileprivate var _height_:CGFloat {
get { return self.frame.size.height }
}
}
public enum MagnifyingViewShap {
case Round
case Square
case Custom
}
public class MagnifyingView: UIView {
public var magnifyView:UIView!
public var scaleFactor:CGFloat = 2.0 {
didSet {
self.setNeedsDisplay()
}
}
public var magnifyShap:MagnifyingViewShap = .Square {
willSet {
UIView.animate(withDuration: 0.25, animations: {
if newValue == .Round {
self.layer.masksToBounds = true
self.layer.cornerRadius = min(self._width_, self._height_) / 2.0
} else {
self.layer.cornerRadius = 0
}
}) { _ in
if newValue == .Square {
self.layer.masksToBounds = false
}
}
}
}
public var exceptOutSide:Bool = true {
didSet {
self.setNeedsDisplay()
}
}
public var touchLocation:CGPoint? {
didSet {
self.setNeedsDisplay()
}
}
override public func draw(_ rect: CGRect) {
super.draw(rect)
if let location = self.touchLocation {
var trsx = -1 * (location.x + self._width_ / self.scaleFactor / 2.0)
var trsy = -1 * (location.y + self._height_ / self.scaleFactor / 2.0)
if self.exceptOutSide {
if location.x <= self._width_ / self.scaleFactor / 2.0 {
trsx = -1 * self._width_ / self.scaleFactor
} else if location.x >= self.magnifyView._width_ - self._width_ / self.scaleFactor / 2.0 {
trsx = -1 * self.magnifyView._width_
}
if location.y <= self._height_ / self.scaleFactor / 2.0 {
trsy = -1 * self._height_ / self.scaleFactor
} else if location.y >= self.magnifyView._height_ - self._height_ / self.scaleFactor / 2.0 {
trsy = -1 * self.magnifyView._height_
}
}
self.isHidden = true
if let context = UIGraphicsGetCurrentContext() {
context.translateBy(x: self._width_, y: self._height_)
context.scaleBy(x: self.scaleFactor, y: self.scaleFactor)
context.translateBy(x: trsx, y: trsy)
self.magnifyView.layer.render(in: context)
}
self.isHidden = false
}
}
}
Вот как я это использую:
@IBOutlet weak var loupe: MagnifyingView!
// then init:
loupe.magnifyView = lassoImageView
loupe.scaleFactor = 2
// this is magnifying func I'm calling in touchesBegan and touchesMoved methods
func magnifyingTouch(position: CGPoint) {
self.loupe.touchLocation = position
}
Это работает, но очень глючит, второй тап работает отлично, как если бы он был кеширован
Может кто знает как это исправить?