Как изменить внешний вид UITableViewController при повороте? - PullRequest
0 голосов
/ 11 сентября 2011

Задача, которую я сейчас пытаюсь сделать с UITableViewController, состоит в том, чтобы иметь строку столбца с одной колонкой в ​​портретном режиме и строку строки с двумя колонками в альбомной ориентации. Это просто для удобства просмотра (используя доступное пространство ширины для просмотра большего количества ячеек строк), поэтому обе ячейки столбца имеют одинаковый формат. Однако я не уверен, как это реализовать.

Итак, мысль состоит в том, чтобы настроить мой элемент в ячейке в методе cellForRowAtIndexPath и проверить текущий режим экрана. Вопрос в том, должен ли я установить какой-либо флаг в "shouldAutorotateToInterfaceOrientation" или для этого есть какие-то настройки?

Во-вторых, достаточно ли было бы просто вызвать перезагрузку таблицы в "shouldAutorotateToInterfaceOrientation", чтобы перерисовать ячейки моей таблицы?

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

Ответы [ 2 ]

1 голос
/ 11 сентября 2011

В вашем коде для tableView:cellForRowAtIndexPath: вы можете проверить текущую ориентацию с помощью:

if (self.interfaceOrientation == UIInterfaceOrientationPortrait ||
    self.interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown) {
    // use a portrait cell
} else {
    // use a landscape cell
}

Также обязательно верните YES из shouldAutorotateToInterfaceOrientation:. Вы также должны перезагрузить tableView после поворота (в didRotateFromInterfaceOrientation:) с помощью [tableView reloadData];, чтобы убедиться, что используются правильные ячейки.

1 голос
/ 11 сентября 2011

Вы должны проверить текущую ориентацию в cellForRowAtIndexPath и правильно настроить ячейку.Вы можете создать 2 разные ячейки с IB.

Кроме того, вам нужно вызвать [myTableView reloadData] в одном из обратных вызовов для событий вращения (shouldAutorotateToInterfaceOrientation или didRotateFromInterfaceOrientation).cellForRowAtIndexPath будет вызываться каждый раз, когда вы звоните [myTableView reloadData] (для всех ячеек).Убедитесь, что вы используете разные идентификаторы для повторного использования ячеек.

РЕДАКТИРОВАТЬ: Вот как я бы кодировал это:

Добавьте 2 IBOutlets в ваш файл .h:

IBOutlet MyCustomCell1 * customCell1;
IBOutlet MyCustomCell2 * customCell2;

В Интерфейсном Разработчике установите свойство идентификатора каждой ячейки, может быть что-то вроде cellIdentifier1 и cellIdentifier2.Убедитесь, что владельцем файла в IB является ваш источник данных (место, где реализовано cellForRowAtIndexPath).

cellForRowAtIndexPath должно выглядеть так:

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    if ([UIDevice currentDevice].orientation == UIDeviceOrientationLandscapeLeft 
    || [UIDevice currentDevice].orientation == UIDeviceOrientationLandscaperight) 
    {
         //Landscape, lets use MyCustomCell2.
         NSString * cellIdentifier2 = @"cellIdentifier2";

         MyCustomCell2 * cell  = (MyCustomCell2 *) [tableView dequeueReusableCellWithIdentifier:cellIdentifier];

         if (cell == nil) {
         //We have to initialize the cell, we're going to use IB
         [[NSBundle mainBundle] loadNibNamed:@"CustomCell2NibName" owner:self options:nil];
         //After this, customCell2 we defined in .h is initialized from IB 
         cell = customCell2;

         }
         //setup the cell, set text and everything.

         return cell;
    }

    else
    {
    //portrait case, the same as before but using CustomCell1
    NSString * cellIdentifier1 = @"cellIdentifier1";

         MyCustomCell1 * cell  = (MyCustomCell1 *) [tableView dequeueReusableCellWithIdentifier:cellIdentifier];

         if (cell == nil) {
         //We have to initialize the cell, we're going to use IB
         [[NSBundle mainBundle] loadNibNamed:@"CustomCell1NibName" owner:self options:nil];
         //After this, customCell1 we defined in .h is initialized from IB 
         cell = customCell1;

         }
         //setup the cell, set text and everything.

         return cell;


     }

}

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