Изменить страницу на UIScrollView
У меня есть UIScrollView с 10 страницами. Я могу переключаться между ними. Я также хочу иметь 2 кнопки (кнопка "назад" и кнопка "Далее"), которые при нажатии перейдут на предыдущую или следующую страницу. Я не могу понять, как это сделать, хотя. Большая часть моего кода исходит из примера кода элемента управления страницей Apple. Кто-нибудь может помочь?
спасибо
11 ответов:
вы просто говорите кнопкам, чтобы перейти к местоположению страницы:
CGRect frame = scrollView.frame; frame.origin.x = frame.size.width * pageNumberYouWantToGoTo; frame.origin.y = 0; [scrollView scrollRectToVisible:frame animated:YES];
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)