Ответ 1
Я использую это для перехода к нижнему колонтитулу таблицыView:
[self.tableView scrollRectToVisible:[self.tableView convertRect:self.tableView.tableFooterView.bounds fromView:self.tableView.tableFooterView] animated:YES];
У меня есть UITableView, содержимое которого динамически меняется, как стек FIFO. Клетки добавляются снизу и удаляются сверху.
Это работает красиво, и я могу прокручивать до indexPath так, чтобы самое новое сообщение всегда прокручивалось вниз (как приложение чата).
Теперь.. Я хочу добавить нижний колонтитул в эту таблицу. Вместо использования
SrollToRowAtIndexPath
Я хотел бы иметь возможность прокручивать в tableFooterView.
Любые идеи, как я могу это сделать, будут оценены.
Я использую это для перехода к нижнему колонтитулу таблицыView:
[self.tableView scrollRectToVisible:[self.tableView convertRect:self.tableView.tableFooterView.bounds fromView:self.tableView.tableFooterView] animated:YES];
Лучший способ прокрутки UITableView
к нижней части его footerView - просто установить смещение содержимого. Вы можете рассчитать нижнюю часть с помощью contentSize
и текущей bounds
Вот как я это делаю.
CGPoint newContentOffset = CGPointMake(0, [self.instanceOfATableView contentSize].height - self.instanceOfATableView.bounds.size.height);
[self.instanceOfATableView setContentOffset:newContentOffset animated:YES];
Благодаря iphone_developer вот что я сделал:
[tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:[tableView numberOfRowsInSection:0]-1 inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:YES];
Затем, когда я добавляю строки, я вызываю это, и мой нижний колонтитул tableView остается видимым
Так много плохих ответов.: -)
ЛУЧШИЙ способ:
[self.tableView scrollRectToVisible:
self.tableView.tableFooterView.frame animated:YES
];
Может быть что-то вроде:
[tableView setContentOffset:CGPointMake(0, tableView.contentSize.height) animated:YES];
Так как UITableView является подклассом UIScrollView, вы можете прокручивать туда, где вам нравится, используя метод UIScrollView
- (void)scrollRectToVisible:(CGRect)rect animated:(BOOL)animated
Просто установите прямоугольник так, чтобы, когда он виден, нижний колонтитул виден, и у вас будет ваше решение (вы можете использовать нижний колонтитул или что-то еще, только пока вы получите правильное поведение все время).
Мой последний ответ для разработчика, которому нужно показывать нижний колонтитул, когда отображается клавиатура. Правильное решение состоит в том, чтобы рассмотреть свойство 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];
}
Самый простой способ сделать это - использовать UITableViewScrollPositionTop в LAST ROW в LAST SECTION. Это очень хорошо для меня...
[tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:LAST_ROW inSection:LAST_SECTION] atScrollPosition:UITableViewScrollPositionTop animated:YES];
Удостоверьтесь, что ваш нижний колонтитул стола хорошо расположен на дне, и он должен сидеть красиво анимированным внутри представления...
Надеюсь, что это поможет...
Эта хорошая работа для меня!
CGRect footerBounds = [addCommentContainer bounds];
CGRect footerRectInTable = [tableview convertRect:footerBounds fromView:addCommentContainer];
[tableview scrollRectToVisible:footerRectInTable animated:YES];
Отличная идея, искала это сама:) Вот пример кода, который бы сделал трюк:
[tableView reloadData];
NSIndexPath *index = [NSIndexPath indexPathForRow:0 inSection:1];
[tableView scrollToRowAtIndexPath:index
atScrollPosition:UITableViewScrollPositionBottom animated:YES];
У вас ДОЛЖЕН иметь хотя бы одну ячейку в нижнем колонтитуле tableView, проблема в том, что она станет видимой. У меня не было времени на тестирование, но я думаю, вы могли бы сделать его действительно маленьким?
Кроме того, вы должны внедрить правильные вещи внутри numberOfSectionsInTableView (по крайней мере один для таблицы и один для нижнего колонтитула), numberOfRowsInSection (по крайней мере один для нижнего колонтитула, последний раздел) viewForHeaderInSection (ноль, кроме вашей ячейки), heightForHeaderInSection (возможно, если вы установите это как ноль), cellForRowAtIndexPath (добавьте специальный случай для своей ячейки в сноска)...
Этого должно быть достаточно.
Я использую это:
- (void)scrollToBottom{
[self.myTable scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:[self.fetchedResultsController.fetchedObjects count] -1 inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:YES];
}
Эта работа для меня:
- (void)tableViewScrollToBottomAnimated:(BOOL)animated {
NSInteger numberOfRows = [self.tableView numberOfRowsInSection:0];
if (numberOfRows) {
if (self.tableView.tableFooterView) {
[self.tableView scrollRectToVisible:
self.tableView.tableFooterView.frame animated:YES
];
} else {
[self.tableView scrollToRowAtIndexPath:
[NSIndexPath indexPathForRow:numberOfRows-1 inSection:0]
atScrollPosition:UITableViewScrollPositionBottom
animated:animated
];
}
}
}
Это работает для меня в 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)
}
Я не пробовал, но что происходит, когда вы прокручиваете до последней строки + 1?
Другая идея заключалась бы в том, чтобы всегда добавлять фиктивную запись в конце и делать ее другим взглядом, поэтому она рассматривается как нижний колонтитул. Затем вы всегда можете прокрутить список до этого.