reloadData в UITableView при изменении deviceOrientation - PullRequest
5 голосов
/ 14 апреля 2011

Я работаю с UITableView, с UITableViewCell. Мое приложение поддерживает альбомную ориентацию, поэтому я создал 2 UITableViewCell: один для portraid и один для ландшафта.

В моем методе cellForRowAtIndexPath это мой код

static NSString *CellIdentifier;
static NSString *NibNamed;

UIDeviceOrientation deviceOrientation = [UIApplication sharedApplication].statusBarOrientation;

if (deviceOrientation != UIDeviceOrientationLandscapeLeft &&
    deviceOrientation != UIDeviceOrientationLandscapeRight)
{
    CellIdentifier= @"Cell1";
    NibNamed = @"cell_news";
}
else
{
    CellIdentifier= @"Cell2";
    NibNamed = @"cell_news_landscape";
}

[[NSBundle mainBundle] loadNibNamed:NibNamed owner:self options:NULL];
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];


if (cell == nil)
{
    NSArray *nib = [[NSBundle mainBundle] loadNibNamed:NibNamed owner:self options:nil];
    cell = [nib objectAtIndex:0];
}
///here i add title, description, ecc... in my UITableViewCell

Тогда в случае с AuthorAteotateToInterfaceOrientation я написал это:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
[my_table reloadData];
return YES;
}

Где проблема? Если я запускаю приложение в портретном режиме, когда я поворачиваю устройство в первый раз, ничего не происходит (а UITableCellView - это Portrait_table_cell). Когда я поворачиваю устройство во второй раз (и нахожусь в портретном или в верхнем положении), я вижу landscape_table_cell (и, конечно, я не вижу весь текст, потому что он выходит с экрана). Итак ... кроме первого раза, в другой раз, когда я поворачиваю устройство, я вижу неправильный table_cell_view !!

Знаете почему? Спасибо!

Ответы [ 4 ]

9 голосов
/ 14 апреля 2011

Ваши данные перезагружаются до того, как устройство изменило ориентацию.shouldAutorotateToInterfaceOrientation вызывается перед любым поворотом.

Попробуйте didRotateFromInterfaceOrientation

- (void) didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation{
 [my_table reloadData];
}

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

4 голосов
/ 14 апреля 2011

Не вызывать reloadData из shouldAutorotateToInterfaceOrientation:

Используйте свойство UIView autoresizingMask для UITableView и UITableViewCell при создании объекта для обоих. потому что UITableView and UITableViewCell are the subclass of UIView`.

@property(nonatomic) UIViewAutoresizing autoresizingMask
0 голосов
/ 14 апреля 2011

Если авторазмер не подходит вам, вы также можете получить индексы видимых ячеек с помощью

- (NSArray *)indexPathsForVisibleRow

, а затем получить сами ячейки с помощью

- (UITableViewCell *)cellForRowAtIndexPath:(NSIndexPath *)indexPath

И вызовите метод, подобный

[cell interfaceOrientationDidChangeTo:interfaceOrientation]

И пусть работа будет выполнена самой ячейкой.

0 голосов
/ 14 апреля 2011

Я думаю, что есть две проблемы. 1) shouldAutoRotateToInterfaceOrientation вызывается ДО поворота представления, поэтому, если вы обновите его, это слишком рано. 2) Я думаю, что вам нужно самим управлять перерисовкой, а не полагаться на reloadData. Поэтому либо переопределите метод перерисовки tableViewCell, либо установите соответствующие маски автоматического изменения размера. Надеюсь это поможет. -Mike

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