iPad: сохранение выбранной ячейки табличного представления на экране - PullRequest
3 голосов
/ 18 июня 2011

На iPad я показываю UIPopover, когда пользователь выбирает ячейки в UITableView. Ячейка остается выбранной, пока всплывающее окно не будет отклонено.

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

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

Обновление: Комбинируя коды Калеба и Квиксильвера, следующее рабочее решение:

-(void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation {
    CGRect activeCellRect = [self.tableView rectForRowAtIndexPath:self.indexPath];
    if ((activeCellRect.origin.y + activeCellRect.size.height) >
        (self.view.frame.origin.y + self.view.frame.size.height))
    {
        // If a row ends up off screen after a rotation, bring it back
        // on screen.
        [self.tableView scrollToRowAtIndexPath:self.indexPath
                              atScrollPosition:UITableViewScrollPositionBottom
                                      animated:YES];
    }
}

Обновление 2, при изменении положения UIPopover: После команды прокрутки необходимо отправить сообщение reloadData в представление таблицы. Тогда метод rectForRowAtIndexPath: правильно сообщит о новой позиции ячейки (в противном случае это не произойдет, так как она не обновляется должным образом после команды прокрутки)!

Ответы [ 2 ]

4 голосов
/ 18 июня 2011

При изменении ориентации попробуйте проверить indexPathsForVisibleRows, чтобы увидеть, видима ли ваша ячейка, а затем, если нет, использовать scrollToRowAtIndexPath, что-то вроде:

-(void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation{
    if (![[self.tableView indexPathsForVisibleRows] containsObject:[self.tableView indexPathForSelectedRow]]) {
        [self.tableView scrollToRowAtIndexPath:[self.tableView indexPathForSelectedRow] atScrollPosition:UITableViewScrollPositionMiddle animated:YES];
    }
}
2 голосов
/ 18 июня 2011

Вы уже знаете, какая строка выбрана, верно?Вы также знаете, когда меняется ориентация устройства, или, по крайней мере, вы можете это знать, потому что для этого есть методы UIViewController.Вы можете получить прямоугольник для выбранной строки, используя метод -rectForRowAtIndexPath: UITableView, и легко убедиться, что прямоугольник остается видимым, используя метод -scrollRectToVisible:animated: UIScrollView, который наследует UITableView.

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