Остановить автопрокрутку в scrollview при быстром взаимодействии с пользователем - PullRequest
0 голосов
/ 28 мая 2019

Я использую pagecontroller в своем приложении.

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

Но у меня возникла одна проблема, когда пользователь вручную прокручивает просмотр прокрутки, в то время как я хочу остановить автопрокрутку.

Пожалуйста, найдите с моим следующим кодом.

var slides:[Slide] = [];
var offSet: CGFloat = 0
override func viewDidLoad() {
    super.viewDidLoad()

    slides = createSlides()
    setupSlideScrollView(slides: slides)

    pageControl.numberOfPages = slides.count
    pageControl.currentPage = 0
    view.bringSubview(toFront: pageControl)

    let timer = Timer.scheduledTimer(timeInterval: 3, target: self, selector: #selector(autoScroll), userInfo: nil, repeats: true)

}

@objc func autoScroll() {
    let totalPossibleOffset = CGFloat(slides.count - 1) * self.view.bounds.size.width
    if offSet == totalPossibleOffset {
        offSet = 0 // come back to the first image after the last image
    }
    else {
        offSet += self.view.bounds.size.width
    }
    DispatchQueue.main.async() {
        UIView.animate(withDuration: 0.3, delay: 0, options: UIViewAnimationOptions.curveLinear, animations: {
            self.scrollView.contentOffset.x = CGFloat(self.offSet)
        }, completion: nil)
    }
}

Ответы [ 2 ]

0 голосов
/ 28 мая 2019

Код не проверен. Вы должны проверить текущий индекс с общим количеством слайдов

Создайте один глобальный индекс, как показано ниже, и измените ваши условия. И вам нужно управлять этим индексом, а также функцией свайпа и сделать недействительным ваш таймер при свайпе. Ваш объект таймера должен быть в глобальном

timer.invalidate()



 var currentPage = 0
        @objc func autoScroll() {
            let totalPossibleOffset = 0
            if currentPage == slides.count {
                currentPage = 0 // come back to the first image after the last image
                totalPossibleOffset = 0
            }
            else {
currentPage = currentPage + 1
                totalPossibleOffset = currentPage * self.view.bounds.size.width

            }
            DispatchQueue.main.async() {
                UIView.animate(withDuration: 0.3, delay: 0, options: UIViewAnimationOptions.curveLinear, animations: {
                    self.scrollView.contentOffset.x = CGFloat(totalPossibleOffset)
                }, completion: nil)
            }
        }
0 голосов
/ 28 мая 2019

Добавьте делегат вида прокрутки и используйте методы scrollViewDidEndDragging, когда он вызывает, просто сбросьте таймер, чтобы через 3 секунды снова начать работать, как есть.

...