Как прокрутить UITableView в tableFooterView - PullRequest
21 голосов
/ 31 августа 2009

У меня есть UITableView, содержимое которого динамически изменяется, как стек FIFO. Клетки добавляются снизу и удаляются сверху.

Это прекрасно работает, и я могу прокрутить до indexPath, чтобы новейшее сообщение всегда прокручивалось вниз (как приложение чата).

Теперь .. Я хочу добавить нижний колонтитул в этот раздел таблицы. Вместо использования

SrollToRowAtIndexPath

Я хотел бы иметь возможность прокручивать до tableFooterView.

Любые идеи, как я могу это сделать, будут оценены.

Ответы [ 14 ]

27 голосов
/ 15 ноября 2010

Лучший способ прокрутить UITableView до нижней части его footerView - просто установить смещение содержимого. Вы можете рассчитать дно, используя contentSize и текущий bounds

Вот как я это делаю.

CGPoint newContentOffset = CGPointMake(0, [self.instanceOfATableView contentSize].height -  self.instanceOfATableView.bounds.size.height);

[self.instanceOfATableView setContentOffset:newContentOffset animated:YES]; 
27 голосов
/ 19 июня 2013

Я использую это для прокрутки к представлению нижнего колонтитула tableView:

[self.tableView scrollRectToVisible:[self.tableView convertRect:self.tableView.tableFooterView.bounds fromView:self.tableView.tableFooterView] animated:YES];
14 голосов
/ 06 марта 2014

Так много плохих ответов. : -)

ЛУЧШИЙ способ:

[self.tableView scrollRectToVisible:
     self.tableView.tableFooterView.frame animated:YES
];
14 голосов
/ 19 ноября 2011

Благодаря iphone_developer вот что я сделал:

[tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:[tableView numberOfRowsInSection:0]-1 inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:YES];

Затем, когда я добавляю строки, я вызываю это, и нижний колонтитул моего tableView остается видимым

4 голосов
/ 11 сентября 2009

Может быть что-то вроде:

[tableView setContentOffset:CGPointMake(0, tableView.contentSize.height) animated:YES];
3 голосов
/ 11 сентября 2009

Так как UITableView является подклассом UIScrollView, вы можете прокручивать туда, куда вам нравится, используя метод UIScrollView

- (void)scrollRectToVisible:(CGRect)rect animated:(BOOL)animated

Просто установите прямоугольник так, чтобы, когда он был виден, нижний колонтитул был виден, и у вас было свое решение (вы можете использовать прямоугольник нижнего колонтитула или что-то еще, только если вы все время получаете правильное поведение).

2 голосов
/ 07 февраля 2014

Мой поздний ответ для разработчика, которому нужно показывать нижний колонтитул, когда отображается клавиатура. Правильное решение - рассмотреть свойство contentInset (которое можно изменить после отображения клавиатуры), так что это очень просто:

- (void)scrollToFooter {
  UIEdgeInsets tableInsets = self.tableView.contentInset;
  CGFloat tableHeight = self.tableView.frame.size.height - tableInsets.bottom - tableInsets.top;
  CGFloat bottom = CGRectGetMaxY(self.tableView.tableFooterView.frame);
  CGFloat offset = bottom - tableHeight;
  if(offset > 0.f) {
    [self.tableView setContentOffset:CGPointMake(0,  offset) animated:YES];
  }
}

Я должен заметить, что в моем случае tableView был добавлен в мой собственный ViewController, и в одной из ячеек есть UITextField, который стал первым респондентом. Чтобы переместить нижний колонтитул показа, когда клавиатура отображается, необходимо зарегистрировать уведомление о том, что клавиатура показала уведомление, и (на iOS7) выполнить этот метод в конце текущего цикла выполнения, так как в этом случае iOS7 автоматически выполняет scrollToRowAtIndexPath после того, как наш метод и нижний колонтитул не будут показаны.

-(void)registerKeyboardNotification {
  [[NSNotificationCenter defaultCenter] addObserver:self
                                           selector:@selector(keyboardDidShown:)
                                               name:UIKeyboardDidShowNotification object:nil];
}

- (void)keyboardDidShown:(id)notification {
  //move to the end of run loop
  [self performSelector:@selector(scrollToFooter) withObject:nil afterDelay:.0];
}
1 голос
/ 10 декабря 2013

Это хорошая работа для меня!

CGRect footerBounds = [addCommentContainer bounds];
CGRect footerRectInTable = [tableview convertRect:footerBounds fromView:addCommentContainer];
[tableview scrollRectToVisible:footerRectInTable animated:YES];
1 голос
/ 15 января 2010

Самый простой способ сделать это - использовать UITableViewScrollPositionTop на LAST ROW в LAST SECTION. Это работает очень хорошо для меня ...

[tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:LAST_ROW inSection:LAST_SECTION] atScrollPosition:UITableViewScrollPositionTop animated:YES];

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

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

0 голосов
/ 12 декабря 2017

Это работает для меня в Swift 4

func addRow() {
    tableView.beginUpdates()
    tableView.insertRows(at: [IndexPath(row: array.count - 1, section: 0)], with: .automatic)
    tableView.endUpdates()

    DispatchQueue.main.async {
        self.scrollToBottom()
    }
}

func scrollToBottom() {
    let footerBounds = tableView.tableFooterView?.bounds
    let footerRectInTable = tableView.convert(footerBounds!, from: tableView.tableFooterView!)
    tableView.scrollRectToVisible(footerRectInTable, animated: true)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...