Переместить прокрутку на следующую страницу на основе текущего индекса контроллера страницы - PullRequest
1 голос
/ 20 апреля 2019

я делаю Pagecontroller с scrollview

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

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

Но я хочу переместить прокрутку во время ручной прокрутки на основе индекса управления страницей.

Например: если текущий яд Pagecontrol равен 1, пользователь вручную прокручивает его до 4-го числа. По моему мнению, следующая позиция прокрутки - 5-я, но она не перемещается на 5-ю, снова возвращается на 2-ю в зависимости от времени, когда она неверна.

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)
    }
}

1 Ответ

0 голосов
/ 20 апреля 2019

Поскольку этот таймер работает, каждые 3 секунды он будет вызывать метод autoScroll(), который выполняет прокрутку вашего ScrollView независимо от вашей ручной прокрутки.

Сначала добавьте делегата в свой viewController

class YourViewController: UIVieController, UIScrollViewDelegate {
  // EXISTING CODE
}

и определите глобальную переменную для таймера. Установите это в поле зрения, установите IBOutlet в вашей storyBoard.

var timer: Timer!
@IBOutlet weak var scrollView: UIScrollView!

В вашем viewDidLoad установите его

override func viewDidLoad() {
    super.viewDidLoad()

    slides = createSlides()
    setupSlideScrollView(slides: slides)

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

    // Set delegate here.        
    scrollView.delegate = self

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

}

Итак, вам придется реализовать UIScrollViewDelegate

1) Реализуйте этот метод делегата и проверьте, если таймер isValid, то invalidate() it. Подробности здесь и Здесь

func scrollViewWillBeginDecelerating(_ scrollView: UIScrollView) {
    if timer.isValid {
      timer.invalidate()
    }
}

2) Когда прокрутка закончится, вам придется снова запланировать таймер, чтобы он начал вызывать autoScroll через каждые 3 секунды. Подробности здесь

func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
     offset = scrollView.contentOffset.x
     timer = Timer.scheduledTimer(timeInterval: 3, target: self, selector: #selector(autoScroll), userInfo: nil, repeats: true)
}

Надеюсь, это поможет.

...