2010-03-19 2 views
7

У меня есть пользовательский UITableViewCell, который содержит несколько UIButtons. Положение каждой кнопки зависит от ширины ячейки. Я установил autoresizingMask = UIViewAutoresizingFlexibleWidth, чтобы он правильно регулировал ширину ячейки и положение кнопок, когда приложение запускается с устройства в ландшафтном или портретном режиме.Поверните пользовательский UITableViewCell

Проблема заключается в том, что устройство поворачивается из одного режима в другое, кнопки не регулируют положения, поскольку UITableViewCell является многоразовым. Другими словами, ячейка не инициализируется на основе новой ширины UITalbeView, потому что функция ячейки initWithStyle вызывается до того, как устройство повернуто и не будет снова вызвано после вращения устройства. Какие-либо предложения?

+0

Это решение намного проще. Просто нужно установить self.contentView.autoresizingMask = UIViewAutoresizingFlexibleWidth; self.contentView.autoresizesSubviews = YES; Он НЕ работает, устанавливая self.autoresizingMask. –

+0

У меня такая же проблема, как и вы, и думал о том, чтобы использовать определенные теги ячеек для каждого случая ориентации, так как эта идея пришла ко мне после размышления. Использование self.contentView.autoresizesSubviews = YES не работает на моей стороне. – user255607

+0

Наконец я использовал еще один трюк. – user255607

ответ

7

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

static NSString*Identifier; 

if ([UIDevice currentDevice].orientation!=UIDeviceOrientationLandscapeLeft && [UIDevice currentDevice].orientation!=UIDeviceOrientationLandscapeRight) { 
       Identifier= @"aCell_portrait"; 
      } 
      else Identifier= @"DocumentOptionIdentifier_Landscape"; 


    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:Identifier]; 
+1

Не работает для пользовательских ячеек ... –

6

Предыдущий ответ имеет серьезную проблему. Вы должны использовать [UIApplication sharedApplication] .statusBarOrientation вместо [UIDevice currebtDevice]. Ориентация, потому что ориентация устройства не имеет ничего общего с ориентацией интерфейса. Ориентация устройства - физическое вращение на основе акселерометра.

+0

Благодарим вас за сообщение о втором варианте. На самом деле оба могут работать. См. Http://stackoverflow.com/questions/2738734/get-current-orientation-of-ipad –

+2

Прошу прощения, вы не правы.Ориентация устройства имеет 6 различных параметров, а ориентация интерфейса - 4. Если ваше устройство лежит на столе, ориентация устройства будет сообщать «Face Up», которая не имеет ничего общего с текущей ориентацией интерфейса. – Hrissan

+0

Хриссан, спасибо за исправление. –

1

Вам необходимо исправить ширину рамки ячеек (при условии, что высота одинакова в портретном и ландшафтном режимах) в вашем методе cellForRowAtIndexPath. Вот что здесь работает. Я использовал для создания пользовательского TableViewCell с IB, и он всегда инициализируется для ширины портрета 320 пикселей. При определении кадра он работает, как ожидалось, даже если ячейка «повторно используется» из очереди.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
... 
UITableViewCell *cell = (UITableViewCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier]; 
if (cell == nil) { 
    // create cell here... 
} 

// Adjust cell frame width to be equal to tableview frame width 
cell.frame = CGRectMake(0, 0, tableView.frame.size.width, cell.frame.size.height); 
... 
} 
13

Поскольку UITableViewCell также является UIView, вы можете переопределить метод setFrame. Каждый раз, когда ваш просмотр таблицы вращается, этот метод будет вызываться для всех ячеек.

-(void)setFrame:(CGRect)frame 
{ 
    [super setFrame:frame]; 

    //Do your rotation stuffs here :) 
} 
0

У меня была аналогичная проблема, и это сообщение мне помогло. В моем случае у меня есть пользовательский класс, объявленный в отдельном файле, и в этом файле у меня есть следующий код в layoutSubviews:

//PORTRAIT CELL 
if ([UIDevice currentDevice].orientation!=UIDeviceOrientationLandscapeLeft && 
    [UIDevice currentDevice].orientation!=UIDeviceOrientationLandscapeRight) 
{ 
    //build the custom content views for portrait mode here 
} 
else 
{ 
    //build the custom content views for landscape mode here 
} 

Тогда на мой взгляд контроллера я просто реализовать willAnimateRotationToInterfaceOrientation: и отправить reloadData сообщение к моему столу Посмотреть.

С этим мне не нужно прикасаться к методу cellForRow.

+1

, используя layoutSubviews, вам не нужно использовать reloadData, и лучше, если вы его не используете, потому что, если вы находитесь в режиме редактирования с изображенной кнопкой удаления и вращаетесь, кнопка удаления исчезнет из-за reloadData – jcesarmobile

2

Отмеченный ответ работает как прелесть в старых версиях iOS. Для iOS 6.0 я использовал следующий код:

static NSString *Identifier; 
if (self.interfaceOrientation==UIInterfaceOrientationPortrait) { 
    [email protected]"aCell_portrait"; 
} 
else { 
    [email protected]"DocumentOptionIdentifier_Landscape"; 
} 

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:Identifier]; 
Смежные вопросы