2009-08-31 4 views
18

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

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

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

SrollToRowAtIndexPath

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

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

ответ

-4

Я не пробовал, но что происходит, когда вы прокручиваете до последней строки + 1?

Другая идея заключалась бы в том, чтобы всегда добавлять фиктивную запись в конец и делать ее другим взглядом, поэтому она рассматривается как нижний колонтитул. Затем вы всегда можете прокрутить список до этого.

+1

Вы получаете ошибку выхода за диапазон :(Я должен был упомянуть, что я попробовал это уже в исходном сообщении. – Kevin

3

Поскольку UITableView является подклассом UIScrollView, вы можете прокручивать туда, где вы, как с помощью метода UIScrollView

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

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

4

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

[tableView setContentOffset:CGPointMake(0, tableView.contentSize.height) animated:YES]; 
1

Самый простой способ сделать это состоит в использовании UITableViewScrollPositionTop на последней строке в предыдущем разделе. Это работает очень хорошо для меня ...

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

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

Надеется, что это помогает .. .

0

Отличная идея, что искал это сам :) Вот пример кода, который будет делать трюк:

[tableView reloadData]; 
NSIndexPath *index = [NSIndexPath indexPathForRow:0 inSection:1]; 
[tableView scrollToRowAtIndexPath:index 
    atScrollPosition:UITableViewScrollPositionBottom animated:YES]; 

Вы должны иметь по крайней мере одну ячейку в вашем Tableview колонтитула, то проблема в том, что это будет видно. Не успел испытать, но я думаю, вы могли бы сделать его действительно маленьким?

Кроме того, вы должны реализовать правильный материал внутри numberOfSectionsInTableView (по крайней мере, один за стол и один для сноски) numberOfRowsInSection (по крайней мере, один для колонтитула, ваша последняя секции), viewForHeaderInSection (ноль для ячейки, кроме) heightForHeaderInSection (может быть, если вы установите это как ноль), cellForRowAtIndexPath (добавить особый случай для вашей ячейки в сноске) ...

этого должно быть достаточно.

25

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

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

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

[self.instanceOfATableView setContentOffset:newContentOffset animated:YES]; 
+0

Мне только удалось заставить его работать, когда я добавил задержку после вызов reloadTable: [self performSelector: @selector (scrollToBottom) withObject: nil afterDelay: 0.3] – Centurion

0

Я использую это:

- (void)scrollToBottom{ 
    [self.myTable scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:[self.fetchedResultsController.fetchedObjects count] -1 inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:YES]; 

}

13

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

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

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

+0

это прокрутит до вершины не ниже – khalil

+2

Нет, [tableView numberOfRowsInSection: 0] -1 - последняя строка, поэтому прокрутка к positionTop на этом строка фактически прокрутит таблицуView до нижнего – Bejil

+0

@Beji это предполагает, что у вас есть только одна секция – Jessedc

27

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

[self.tableView scrollRectToVisible:[self.tableView convertRect:self.tableView.tableFooterView.bounds fromView:self.tableView.tableFooterView] animated:YES]; 
+2

Простой и удобный в использовании! –

+0

+1! это правильный ответ, каждый ответ, который я тестировал, не работал правильно при определенных обстоятельствах. – JohnPayne

+0

Теоретически это хорошо, на практике он не может быть привязан к обновлениям табличного вида - например, вставки и удаления строк при анимационном представлении таблицы. scrollToIndexPath работает для этого – n13

1

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

CGRect footerBounds = [addCommentContainer bounds]; 
CGRect footerRectInTable = [tableview convertRect:footerBounds fromView:addCommentContainer]; 
[tableview scrollRectToVisible:footerRectInTable animated:YES]; 
2

Мой поздний ответ для разработчиков, которым необходимо показать нижний колонтитул при отображении клавиатуры. Правильное решения рассмотреть свойство 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]; 
} 
11

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

Лучший способ:

[self.tableView scrollRectToVisible: 
    self.tableView.tableFooterView.frame animated:YES 
]; 
+0

Это предполагает, что 'tableFooterView' будет либо всегда быть прямым поднабором' tableView', либо находиться в начале промежуточных представлений. Хотя это может работать и сейчас, нет никаких гарантий того, что иерархия subview 'tableView' останется прежней в будущих версиях iOS. – Ned

+0

@ Kumar KL, это не работает с пользовательским нижним колонтитулом и несколькими нижними колонтитулами. –

0

Эта работа мне:

- (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 
      ]; 
     } 
    } 
} 
0

Это работает для меня в 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) 
} 
Смежные вопросы