Прокрутите сразу, чтобы грести в таблице перед просмотром шоу - PullRequest
10 голосов
/ 29 мая 2010

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

NSIndexPath *scrollToPath = [NSIndexPath indexPathForRow:5 inSection:0]; 
[theTable scrollToRowAtIndexPath:scrollToPath atScrollPosition:UITableViewScrollPositionTop animated:NO];

Когда я помещаю его в метод viewDiDAppear, он кратковременно мигает из начальной позиции таблицы (вверху) в нужную строку. Я не хочу, чтобы это показывало начальную позицию. Если я добавлю его в viewDidLoad или viewWillAppear, то произойдет сбой с NSRangeException, предположительно, потому что таблица еще не настроена.

Как заставить его прокручиваться, не показывая начальную позицию?

Ответы [ 7 ]

15 голосов
/ 29 мая 2010

Спасибо Shaggy и Dying Cactus за то, что указали мне правильное направление. Ответ заключается в том, чтобы загрузить таблицу и прокрутить viewWillAppear:

-(void)viewWillAppear:(BOOL)animated
{
    [theTable reloadData];
    NSIndexPath *scrollToPath = [NSIndexPath indexPathForRow:5 inSection:0]; 
    [theTable scrollToRowAtIndexPath:scrollToPath atScrollPosition:UITableViewScrollPositionTop animated:NO];   
}
4 голосов
/ 05 сентября 2016

У меня была точно такая же проблема, после попытки всего, это сработало, ключ в том, что если вы используете autolayout, вы должны написать код scrollToBottom в viewDidLayoutSubviews

Инициализируйте scrollToBottom в true, а затем сделайте это

- (void)viewDidLayoutSubviews {
    [super viewDidLayoutSubviews];
    // Scroll table view to the last row
    [self scrollToBottom];
}

-(void)scrollToBottom {
    if (shouldScrollToLastRow)
    {
        CGPoint bottomOffset = CGPointMake(0, self.tableView.contentSize.height - self.tableView.bounds.size.height);
        [self.tableView setContentOffset:bottomOffset animated:NO];
    } }

выполнение этого гарантирует, что вы почти в нижней части таблицы, но не в самой нижней части, так как невозможно точно определить смещение дна, когда вы находитесь в верхней части таблицы, поэтому после этого мы можем реализовать scrollViewDidScroll

-(void)scrollViewDidScroll: (UIScrollView*)scrollView
{
    float scrollViewHeight = scrollView.frame.size.height;
    float scrollContentSizeHeight = scrollView.contentSize.height;
    float scrollOffset = scrollView.contentOffset.y;

    // if you're not at bottom then scroll to bottom
    if (!(scrollOffset + scrollViewHeight == scrollContentSizeHeight))
    {
        [self scrollToBottom];
    } else {
    // bottom reached now stop scrolling
        shouldScrollToLastRow = false;
    }
}
3 голосов
/ 17 мая 2015

Вызов scrollToRowAtIndexPath: в viewWillAppear: у меня не работает, потому что tableView еще не загружен. Но я мог бы решить эту проблему с помощью вызова scrollToRowAtIndexPath: после некоторой задержки.

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    [self performSelector:@selector(scrollToCell) withObject:nil afterDelay:0.1];
}

- (void) scrollToCell
{
    [_tableView reloadData];
    NSIndexPath *scrollToPath = [NSIndexPath indexPathForRow:5 inSection:0];
    [_tableView scrollToRowAtIndexPath:scrollToPath atScrollPosition:UITableViewScrollPositionTop animated:NO];
}

Надеюсь, это кому-нибудь поможет.

2 голосов
/ 21 мая 2016

Вы можете использовать GCD для отправки прокрутки в следующую итерацию основного цикла выполнения в viewDidLoad для достижения этого поведения. Прокрутка будет выполнена до того, как табличное представление отобразится на экране, поэтому мигание не будет.

- (void)viewDidLoad {
   dispatch_async (dispatch_get_main_queue (), ^{
        NSIndexPath *indexPath = YOUR_DESIRED_INDEXPATH;
        [self.tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionTop animated:NO];
    }];
}
2 голосов
/ 29 мая 2010

Если я положу его в viewDidLoad или viewWillAppear, то он падает с NSRangeException, вероятно, потому что стол еще не накрыт.

Почему стол еще не накрыт? В каком методе вы его настраиваете?

1 голос
/ 29 мая 2010

Я только что закончил бороться с этим. Моя добавляла панель поиска в верхнюю часть списка, изначально скрытую под верхней частью ... аля некоторые из основных приложений. Я собирался задать этот же вопрос!

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

Я использую ABTableViewCell (вы можете использовать его в Google) для пользовательских нарисованных ячеек (красиво и быстро!), И когда меня вызывают, чтобы нарисовать вторую строку (вы можете сделать это в ваших пользовательских клетках без ABTableViewCell), я устанавливаю там, с одним огненным семафором:

if ( self.mOnlyOnce == NO && theRow > 1 ) {
    self.mOnlyOnce = YES;
    [self.mParentTable scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:1] atScrollPosition:UITableViewScrollPositionTop animated:NO];
}

(выберите подходящую строку / секцию, которая вам подходит ... если бы они были в одной секции, вы, вероятно, установили бы в строке что-то отличное от 0)

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

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

наслаждаться

0 голосов
/ 12 мая 2015

в iOS 8 и выше [self.tableView reloadData] в viewWillAppear до scrollToRowAtIndexPath не работает, вам нужно перезагрузить в viewDidAppear, как указано ниже:

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:YES];

    [self.tableView reloadData];

     [self.tableView scrollToRowAtIndexPath:[[NSIndexPath indexPathForRow:18 inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:YES];

}

Примечание: вы должны использовать UITableViewScrollPositionTop, иначе прокрутка будет не такой, как ожидалось, и может прокрутиться до дна и даже до пустых областей после последней строки, если вы указали scrollToRow в качестве последней строки.

Я думаю, что в iOS 8 и выше при первой загрузке tableView он не загружает все данные, использованные для построения таблицы, поэтому вам нужно использовать [tableView reload], что, на мой взгляд, немного странно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...