UIScrollView Touch не работает при автоматической прокрутке - PullRequest
0 голосов
/ 31 марта 2020

У меня есть UIScrollView, внутри которого у меня есть несколько предметов. У меня есть функция в моем приложении, если кто-то нажимает кнопку прокрутки и начинает автоматически прокручиваться с определенной скоростью. Но это приводит к тому, что все касания перестают работать в режиме прокрутки. Моя цель состоит в том, чтобы всякий раз, когда пользователь начинает прокручивать вручную, я хочу, чтобы автоматическая прокрутка была остановлена ​​автоматически. Но ручная прокрутка перестает работать, когда работает автопрокрутка.

Вот мои коды для автопрокрутки

self.scrollTimer = Timer.scheduledTimer(timeInterval: 0.5, target: self, selector: #selector(timerAction), userInfo: nil, repeats: true)
    self.scrollTimer!.fire()
    RunLoop.current.add(self.scrollTimer!, forMode: RunLoopMode.commonModes)

var yOffset: CGFloat = 0
    var offsetIncrementer: CGFloat = 5

    @objc func timerAction() {
        yOffset += offsetIncrementer
        if quranContainer.frame.height <= yOffset + self.view.frame.height {
            yOffset = 0
        }

        DispatchQueue.main.async {
            UIView.animate(withDuration: 1.0) {
                self.scrollView.contentOffset.y = self.yOffset
            }
        }
    }

Мой вывод https://youtu.be/QrYovPMvoBo

Ответы [ 2 ]

0 голосов
/ 31 марта 2020

Хорошо, решил проблему. UIView анимация удаляла userInteractions. Необходимо передать allowUserInteraction в опциях с методом animate

. Вот как я решил проблему:

UIView.animate(withDuration: 1.0,
                           delay: 0,
                           options: [.allowUserInteraction],
                           animations: {
                            self.scrollView.contentOffset.y = self.yOffset
            })
0 голосов
/ 31 марта 2020
 override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
         super.touchesBegan(touches, with: event)
         stopPlayerTimer() 
  }


  override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?){
        super.touchesEnded(touches, with: event)
        startPlayerTimer()
   }


    func startPlayerTimer(){
        if self.scrollTimer == nil {
            Timer.scheduledTimer(timeInterval: 0.5, target: self, selector: #selector(timerAction), userInfo: nil, repeats: true)
            self.scrollTimer?.fire()
        }
    }

    func stopPlayerTimer(){
        self.scrollTimer?.invalidate()
        self.scrollTimer = nil
     }


расписание , затем сработает.

self.scrollTimer = Timer.scheduledTimer(timeInterval: 0.5, target: self, selector: #selector(timerAction), userInfo: nil, repeats: true)
self.scrollTimer.fire()

Поскольку прокрутка отключила обновление вашего таймера.

Ваш таймер не находится под RunLoop.Mode.tracking по умолчанию


добавить таймер в общий режим RunL oop, затем ок

RunLoop.current.add(timer, forMode: RunLoop.Mode.common)

...