Изменить страницу на UIScrollView - PullRequest
55 голосов
/ 18 декабря 2009

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

Спасибо

Ответы [ 11 ]

133 голосов
/ 18 декабря 2009

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

CGRect frame = scrollView.frame;
frame.origin.x = frame.size.width * pageNumberYouWantToGoTo;
frame.origin.y = 0;
[scrollView scrollRectToVisible:frame animated:YES];
18 голосов
/ 08 января 2014
scroll.contentOffset = CGPointMake(scroll.frame.size.width*pageNo, 0);
16 голосов
/ 26 сентября 2014

Вот реализация для 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)
13 голосов
/ 26 октября 2016

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

func scrollToPage(_ page: Int) {
    UIView.animate(withDuration: 0.3) { 
        self.scrollView.contentOffset.x = self.scrollView.frame.width * CGFloat(page)
    }
}
7 голосов
/ 26 октября 2016

Для 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)
2 голосов
/ 01 мая 2017

Сначала создайте расширение 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
2 голосов
/ 03 июня 2015

Вот статический метод в 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)
}
2 голосов
/ 26 февраля 2012

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

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];
0 голосов
/ 03 января 2018

Swift Solution

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)
}
0 голосов
/ 23 февраля 2016

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

let frame = scrollView.frame
    let offset:CGPoint = CGPoint(x: CGFloat(sender.currentPage) * frame.size.width, y: 0)
    self.scrollView.setContentOffset(offset, animated: true)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...