Вопрос

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

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

Это было полезно?

Решение 2

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

Другие советы

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

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

    //Do your rotation stuffs here :)
} 

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

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

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

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:Identifier];

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top