Повернуть пользовательский UITableViewCell - PullRequest
7 голосов
/ 19 марта 2010

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

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

Ответы [ 6 ]

13 голосов
/ 01 июня 2011

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

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

    //Do your rotation stuffs here :)
} 
7 голосов
/ 19 марта 2010

Проведя часы исследований (включая сообщения на этом сайте), я не смог найти никаких решений. Но лампочка включается внезапно. Решение очень простое. Просто определите, является ли ориентация устройства альбомным или портретным режимом, и определите 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];
6 голосов
/ 19 декабря 2010

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

2 голосов
/ 07 марта 2013

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

static NSString *Identifier;
if (self.interfaceOrientation==UIInterfaceOrientationPortrait) {
    Identifier=@"aCell_portrait";
}
else {
    Identifier=@"DocumentOptionIdentifier_Landscape";
}

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:Identifier];
1 голос
/ 26 декабря 2010

Вам нужно будет зафиксировать ширину рамки ваших ячеек (при условии, что высота одинакова в портретном и альбомном режимах) в рамках вашего метода 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);
 ...
}
0 голосов
/ 14 марта 2012

У меня была похожая проблема, и этот пост помог мне. В моем случае у меня есть собственный класс, объявленный в отдельном файле, и в этом файле у меня есть следующий код в 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.

...