Прокручивайте UIScrollView быстрее при прокрутке через другое представление

У меня есть UIScrollView с большим UIImageView с изображением очень высокого разрешения (около 10 000 x 10 000). В этом UIImageView включено масштабирование и прокрутка. У меня также есть UIImageView меньшего размера с тем же изображением с гораздо меньшим разрешением (около 100 x 100). Я показываю видимую часть большего UIImageView на меньшем UIImageView. И пользователь может перемещаться в другие места на большем UIImageView, перемещаясь на меньшем UIImageView. Следующие изображения показывают то, что я пытаюсь объяснить. Моя проблема заключается в том, что при панорамировании меньшего UIImageView прокрутка в большом UIScrollView очень медленная. введите здесь описание изображения

// function that handles the pan on green view
func handlePanNavigation(gestureRecognizer: UIPanGestureRecognizer) {

    if gestureRecognizer.state == .began || gestureRecognizer.state == .changed {
        let translation = gestureRecognizer.translation(in: navigationPanel)
        guard let gv = gestureRecognizer.view else { return }
        let point = CGPoint(x: gv.center.x + translation.x, y: gv.center.y + translation.y)
        gestureRecognizer.view?.center = point
        gestureRecognizer.setTranslation(.zero, in: navigationPanelView)

        let transform = CGAffineTransform(scaleX: orgSize.width*tiledScrollView.zoomScale/navSize.width, y: orgSize.height*tiledScrollView.zoomScale/navSize.height)
        let offset = navigationPanelView.frame.origin.applying(transform)
        tiledScrollView.setContentOffset(offset, animated: true)
    }
}

person Frankenstein    schedule 12.12.2017    source источник


Ответы (2)


Вы не должны анимировать изменение смещения содержимого при применении преобразования пользовательского ввода в реальном времени, так как это может легко замедлить обратную связь.

Изменять

tiledScrollView.setContentOffset(offset, animated: true)

to

tiledScrollView.setContentOffset(offset, animated: false)
person Tamás Sengel    schedule 12.12.2017

Я не совсем уверен, как вы хотите этого добиться, но если вы хотите замедлить или ускорить перевод жеста панорамирования, добавьте множитель.

switch gesture.state {

    case .began:
        gesture.setTranslation(CGPoint.zero, in: gesture.view)

    case .changed:

        gesture.setTranslation(CGPoint.zero, in: gesture.view)

        if someView.frame.origin.y < someThreshold {
            someView.center = CGPoint(x: someView.center.x, y: someView.center.y + (translation.y * 0.25))
        }

    ...

Здесь любое панорамирование вверх за пределы someThreshold происходит в 4 раза медленнее. В вашем случае, очевидно, добавьте множитель больше 1.

person liquid    schedule 12.12.2017
comment
Я пробовал это, но это не дает желаемого результата. Проблема в том, что когда мы вводим жест панорамирования, увеличенный вид не переводит видимую область в желаемую область. - person Frankenstein; 15.12.2017