проблема с быстрым увеличением изображения - изображение глючит - PullRequest
0 голосов
/ 06 мая 2019

Я пытаюсь сделать лупу для 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
}

Работает, но очень глючит, второй тап отлично работает, как если бы он был кеширован

Может, кто-то знает, как это исправить?

...