Подтвердить что ты не робот

Как прокрутить UITableView в tableFooterView

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

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

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

SrollToRowAtIndexPath

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

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

4b9b3361

Ответ 1

Я использую это для перехода к нижнему колонтитулу таблицыView:

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

Ответ 2

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

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

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

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

Ответ 3

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

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

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

Ответ 4

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

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

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

Ответ 5

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

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

Ответ 6

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

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

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

Ответ 7

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

Ответ 8

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

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

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

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

Ответ 9

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

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

Ответ 10

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

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

У вас ДОЛЖЕН иметь хотя бы одну ячейку в нижнем колонтитуле tableView, проблема в том, что она станет видимой. У меня не было времени на тестирование, но я думаю, вы могли бы сделать его действительно маленьким?

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

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

Ответ 11

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

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

}

Ответ 12

Эта работа для меня:

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

Ответ 13

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

Ответ 14

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

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