Изменить страницу на UIScrollView


У меня есть UIScrollView с 10 страницами. Я могу переключаться между ними. Я также хочу иметь 2 кнопки (кнопка "назад" и кнопка "Далее"), которые при нажатии перейдут на предыдущую или следующую страницу. Я не могу понять, как это сделать, хотя. Большая часть моего кода исходит из примера кода элемента управления страницей Apple. Кто-нибудь может помочь?

спасибо

11 53

11 ответов:

вы просто говорите кнопкам, чтобы перейти к местоположению страницы:

CGRect frame = scrollView.frame;
frame.origin.x = frame.size.width * pageNumberYouWantToGoTo;
frame.origin.y = 0;
[scrollView scrollRectToVisible:frame animated:YES];
scroll.contentOffset = CGPointMake(scroll.frame.size.width*pageNo, 0);

scrollRectToVisible не работал для меня, поэтому мне пришлось анимировать contentOffset. Этот код работает в swift 3.

func scrollToPage(_ page: Int) {
    UIView.animate(withDuration: 0.3) { 
        self.scrollView.contentOffset.x = self.scrollView.frame.width * CGFloat(page)
    }
}

вот реализация для Swift 4:

func scrollToPage(page: Int, animated: Bool) {
    var frame: CGRect = self.scrollView.frame
    frame.origin.x = frame.size.width * CGFloat(page)
    frame.origin.y = 0
    self.scrollView.scrollRectToVisible(frame, animated: animated)
}

и легко вызывается по телефонам:

self.scrollToPage(1, animated: true)

Edit:

более хороший способ сделать это, чтобы поддерживать как горизонтальное и вертикальное разбиение. Вот удобное расширение для этого:

extension UIScrollView {

    func scrollTo(horizontalPage: Int? = 0, verticalPage: Int? = 0, animated: Bool? = true) {
        var frame: CGRect = self.frame
        frame.origin.x = frame.size.width * CGFloat(horizontalPage ?? 0)
        frame.origin.y = frame.size.width * CGFloat(verticalPage ?? 0)
        self.scrollRectToVisible(frame, animated: animated ?? true)
    }

}

это создает расширение на UIScrollView, где вы можете прокручивать любую страницу, вертикальную или горизонтальную.

self.scrollView.scrollTo(horizontalPage: 0)
self.scrollView.scrollTo(verticalPage: 2, animated: true)
self.scrollView.scrollTo(horizontalPage: 1, verticalPage: 2, animated: true)

на Swift 3 это расширение, которое я нахожу очень удобным:

extension UIScrollView {
    func scrollToPage(index: UInt8, animated: Bool, after delay: TimeInterval) {
        let offset: CGPoint = CGPoint(x: CGFloat(index) * frame.size.width, y: 0)
        DispatchQueue.main.asyncAfter(deadline: .now() + delay, execute: {
            self.setContentOffset(offset, animated: animated)
        })
    }
}

и вы называете это так:

scrollView.scrollToPage(index: 1, animated: true, after: 0.5)

вы можете сделать это так :

CGRect lastVisibleRect;
CGSize contentSize = [_scrollView contentSize];
lastVisibleRect.size.height = contentSize.height; 
lastVisibleRect.origin.y = 0.0; 
lastVisibleRect.size.width = PAGE_WIDTH; 
lastVisibleRect.origin.x  = contentSize.width - PAGE_WIDTH * (_totalItems - pageIndex); // total item of scrollview and your current page index

[_scrollView scrollRectToVisible:lastVisibleRect animated:NO];

вот статический метод в swift:

static func scrollToPage(scrollView: UIScrollView, page: Int, animated: Bool) {
    var frame: CGRect = scrollView.frame
    frame.origin.x = frame.size.width * CGFloat(page);
    frame.origin.y = 0;
    scrollView.scrollRectToVisible(frame, animated: animated)
}

сначала создайте расширение UIScrollView, например:

extension UIScrollView {

    func setCurrentPage(position: Int) {
        var frame = self.frame;
        frame.origin.x = frame.size.width * CGFloat(position)
        frame.origin.y = 0
        scrollRectToVisible(frame, animated: true)
    }

}

тогда просто звоните:

self.scrollView.setCurrentPage(position: 2)  // where 2 is your desired page

Если scrollRectToVisible не работает, попробуйте этот :

let frame = scrollView.frame
    let offset:CGPoint = CGPoint(x: CGFloat(sender.currentPage) * frame.size.width, y: 0)
    self.scrollView.setContentOffset(offset, animated: true)

Быстрое Решение

func changePage(pageControl: UIPageControl) {

    let page = CGFloat(pageControl.currentPage)
    var frame = self.scrollView.frame
    frame.origin.x = frame.size.width * page
    frame.origin.y = 0
    self.scrollView.scrollRectToVisible(frame, animated: true)
}

дополнительно к этому коду, что mjdth добавил, Не забудьте поместить его в viewWillAppear или viewDidAppear.

CGRect frame = scrollView.frame;
frame.origin.x = frame.size.width * pageNumberYouWantToGoTo;
frame.origin.y = 0;
[scrollView scrollRectToVisible:frame animated:YES];