Как плавно масштабировать вид с помощью событий Option + прокрутка мыши - PullRequest
0 голосов
/ 25 мая 2020

Я пытаюсь реализовать плавное увеличение и уменьшение масштаба, используя прокрутку мыши + клавишу Option, но не могу понять, как это сделать.

В настоящее время у меня есть ViewController, который устанавливает размер кадра для представления равным быть увеличенным, который размещен в NSScrollView.

Однако это приводит к очень неустойчивому масштабированию - есть ли у кого-нибудь предложения о том, как добиться хорошего плавного масштабирования при использовании колеса прокрутки мыши

/// Capture mouse scroll wheel events and send to zoom function with mouse location
    /// so we can zoom in to the location
    override func scrollWheel(with event: NSEvent) {

        guard event.modifierFlags.contains(.option) else {
            super.scrollWheel(with: event)
            return
        }

        let dy = event.deltaY
        if dy != 0.0 {

            self.scrollZoom(dy, location: event.locationInWindow)

        }
    }

    func scrollZoom(_ delta: CGFloat, location: CGPoint) {

        zoom += delta * scrollZoomSpeedMultiplier

        let frame = caLayoutView.frame
        let newSize = CGSize(width: frame.width*zoom, height: frame.height*zoom)
        let newOrigin = frame.origin // Need to calculate the origin but for now just get smooth zoom to work

        caLayoutView.animator().frame = CGRect(origin: newOrigin, size: newSize)

    }

1 Ответ

0 голосов
/ 27 мая 2020

Хорошо, это полная нелепость - я потратил на это несколько дней. И все лежащие в основе CALayers и изображения масштабируются в векторе - здесь нет пиксельного масштабирования растрового изображения. И это ослепительно быстро, без заиканий или колебаний. Для меня масштабирование и увеличение - это две разные вещи, поэтому я даже не думал об этом раньше - и я уверен, что сделал и получил некоторый пиксельный беспорядок - мое плохое. Надеюсь, это сэкономит время кому-то еще.

К вашему сведению, у меня есть большой PDF-файл, отрендеренный в фоновом CALayer, а затем 100+ перетаскиваемых объектов, каждый в своих CALayers, сверх этого. Теперь все масштабируется, масштабируется и перемещается так же плавно, как и любой из лучших графических пакетов, например Affinity Designer et c.

Все еще в шоке и чего-то жду, go все сумасшедшие.

   override func scrollWheel(with event: NSEvent) {

        guard event.modifierFlags.contains(.option) else {
            super.scrollWheel(with: event)
            return
        }

        let dy = event.deltaY
        if dy != 0.0 {

            let magnification = self.scrollView.magnification + dy/30
            let point = self.scrollView.contentView.convert(event.locationInWindow, from: nil)

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