UIScrollView прокрутить вниз программно - PullRequest
271 голосов
/ 04 июня 2009

Как я могу сделать UIScrollView прокрутку вниз в моем коде? Или в более общем виде, в любой точке подпредставления?

Ответы [ 24 ]

596 голосов
/ 04 июня 2009

Вы можете использовать функцию setContentOffset:animated: UIScrollView для прокрутки к любой части представления содержимого. Вот некоторый код, который будет прокручиваться вниз, предполагая, что ваш scrollView self.scrollView:

CGPoint bottomOffset = CGPointMake(0, self.scrollView.contentSize.height - self.scrollView.bounds.size.height + self.scrollView.contentInset.bottom);
[self.scrollView setContentOffset:bottomOffset animated:YES];

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

97 голосов
/ 02 апреля 2015

Быстрая версия принятого ответа для легкого копирования копии:

let bottomOffset = CGPoint(x: 0, y: scrollView.contentSize.height - scrollView.bounds.size.height)
scrollView.setContentOffset(bottomOffset, animated: true)
50 голосов
/ 07 марта 2014

Самое простое решение:

[scrollview scrollRectToVisible:CGRectMake(scrollview.contentSize.width - 1,scrollview.contentSize.height - 1, 1, 1) animated:YES];
26 голосов
/ 06 сентября 2013

Просто улучшение существующего ответа.

CGPoint bottomOffset = CGPointMake(0, self.scrollView.contentSize.height - self.scrollView.bounds.size.height + self.scrollView.contentInset.bottom);
[self.scrollView setContentOffset:bottomOffset animated:YES];

Он также заботится о нижней вставке (если вы используете ее для настройки вида прокрутки, когда клавиатура видна)

19 голосов
/ 11 июня 2011

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

Правильное решение - прокрутить нижнюю часть содержимого до низа вида прокрутки, как показано ниже (sv это UIScrollView):

CGSize csz = sv.contentSize;
CGSize bsz = sv.bounds.size;
if (sv.contentOffset.y + bsz.height > csz.height) {
    [sv setContentOffset:CGPointMake(sv.contentOffset.x, 
                                     csz.height - bsz.height) 
                animated:YES];
}
15 голосов
/ 07 июля 2016

Решение Swift 2.2 с учетом contentInset

let bottomOffset = CGPoint(x: 0, y: scrollView.contentSize.height - scrollView.bounds.size.height + scrollView.contentInset.bottom)
scrollView.setContentOffset(bottomOffset, animated: true)

Это должно быть в расширении

extension UIScrollView {

  func scrollToBottom() {
    let bottomOffset = CGPoint(x: 0, y: contentSize.height - bounds.size.height + contentInset.bottom)
    setContentOffset(bottomOffset, animated: true)
  }
}

Обратите внимание, что вы можете проверить, если bottomOffset.y > 0 перед прокруткой

13 голосов
/ 06 июля 2016

Быстрая реализация:

extension UIScrollView {
   func scrollToBottom(animated: Bool) {
     if self.contentSize.height < self.bounds.size.height { return }
     let bottomOffset = CGPoint(x: 0, y: self.contentSize.height - self.bounds.size.height)
     self.setContentOffset(bottomOffset, animated: animated)
  }
}

используйте это:

yourScrollview.scrollToBottom(animated: true)
13 голосов
/ 17 февраля 2012

Прокрутить наверх

- CGPoint topOffset = CGPointMake(0, 0);
- [scrollView setContentOffset:topOffset animated:YES];

Прокрутка к низу

- CGPoint bottomOffset = CGPointMake(0, scrollView.contentSize.height - self.scrollView.bounds.size.height);
 - [scrollView setContentOffset:bottomOffset animated:YES];
11 голосов
/ 16 января 2016

Что если contentSize ниже bounds?

Для Свифта это:

scrollView.setContentOffset(CGPointMake(0, max(scrollView.contentSize.height - scrollView.bounds.size.height, 0) ), animated: true)
7 голосов
/ 05 июня 2009

Я также нашел другой полезный способ сделать это в случае, если вы используете UITableview (который является подклассом UIScrollView):

[(UITableView *)self.view scrollToRowAtIndexPath:scrollIndexPath atScrollPosition:UITableViewScrollPositionBottom animated:YES];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...