Вопрос: UITableView, прокрутите вниз до перезагрузки?


у меня есть UITableView с cells которые динамически обновляются. Все отлично работает, когда tableview.reload (см. ниже), чтобы обновить cells в таблице я хотел бы, чтобы таблица прокручивалась в нижнюю часть, чтобы показать новые записи.

- (void)reloadTable:(NSNotification *)notification {
    NSLog(@"RELOAD TABLE ...");
    [customTableView reloadData];
    // Scroll to bottom of UITable here ....
}

Я планировал использовать scrollToRowAtIndexPath:atScrollPosition:animated: но потом заметил, что у меня нет доступа к indexPath,

Кто-нибудь знает, как это сделать, или delegate который я мог бы использовать?


54


источник


Ответы:


Использование:

NSIndexPath* ipath = [NSIndexPath indexPathForRow: cells_count-1 inSection: sections_count-1];
[tableView scrollToRowAtIndexPath: ipath atScrollPosition: UITableViewScrollPositionTop animated: YES];

Или вы можете указать индекс раздела вручную (если один раздел => индекс = 0).


119



-(void)scrollToBottom{

        [self.tableView scrollRectToVisible:CGRectMake(0, self.tableView.contentSize.height - self.tableView.bounds.size.height, self.tableView.bounds.size.width, self.tableView.bounds.size.height) animated:YES];

}

33



Другое решение - перевернуть стол по вертикали и перевернуть каждую ячейку по вертикали:

При инициализации примените преобразование к UITableView:

tableview.transform = CGAffineTransformMakeScale(1, -1);

и в cellForRowAtIndexPath:

cell.transform = CGAffineTransformMakeScale(1, -1);

Таким образом, вам не нужны обходные пути для прокрутки, но вам нужно будет немного подумать о contentInsets / contentOffsets и взаимодействиях header / footer.


29



//In swift 

var iPath = NSIndexPath(forRow: self.tableView.numberOfRowsInSection(0)-1, 
                        inSection: self.tableView.numberOfSections()-1)
self.tableView.scrollToRowAtIndexPath(iPath, 
                                      atScrollPosition: UITableViewScrollPosition.Bottom,                     
                                      animated: true)

9



Это еще одно решение, хорошо работающее в моем случае, когда высота ячейки велика.

- (void)scrollToBottom
{
    CGPoint bottomOffset = CGPointMake(0, _bubbleTable.contentSize.height - _bubbleTable.bounds.size.height);
    if ( bottomOffset.y > 0 ) {
        [_bubbleTable setContentOffset:bottomOffset animated:YES];
    }
}

4



Поскольку это то, что вы, возможно, захотите использовать очень часто, я предлагаю вам создать расширение класса в UITableView:

extension UITableView {
    func scrollToBottom(animated: Bool = true) {
        let section = self.numberOfSections
        if section > 0 {
            let row = self.numberOfRowsInSection(section - 1)
            if row > 0 {
                self.scrollToRowAtIndexPath(NSIndexPath(forRow: row - 1, inSection: section - 1), atScrollPosition: .Bottom, animated: animated)
            }
        }
    }
}

3



расширение лучше делать в UIScrollView вместо UITableView, таким образом он работает на scrollView, tableView, collectionView (вертикальный), UIWebView (внутренний просмотр прокрутки) и т. д.

public extension UIScrollView {

    public func scrollToBottom(animated animated: Bool) {
        let rect = CGRectMake(0, contentSize.height - bounds.size.height, bounds.size.width, bounds.size.height)
        scrollRectToVisible(rect, animated: animated)
    }

}

1



Это лучший способ.

- (void)scrollToBottom
{
    CGFloat yOffset = 0;

    if (self.tableView.contentSize.height > self.tableView.bounds.size.height) {
        yOffset = self.tableView.contentSize.height - self.tableView.bounds.size.height;
    }

    [self.tableView setContentOffset:CGPointMake(0, yOffset) animated:NO];
}

0



Популярные вопросы: