Подтвердить что ты не робот

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

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

Спасибо

4b9b3361

Ответ 1

Вы просто скажите кнопкам прокрутить страницу до адреса:

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

Ответ 2

scroll.contentOffset = CGPointMake(scroll.frame.size.width*pageNo, 0);

Ответ 3

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

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

Ответ 4

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

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)

Ответ 5

Для 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)

Ответ 6

Вы можете сделать это следующим образом:

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];

Ответ 7

Вот быстрый статический метод:

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

Ответ 8

Сначала создайте расширение 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

Ответ 9

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

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

Ответ 10

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

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