Pergunta

Eu tenho um UABILDVIEWCELL Custom que contém vários UIBUTTONS. A posição do quadro de cada botão é relativa à largura da célula. Definto automatiza automática = UIViewautoresingFlexibleWidth para ajustar a largura da célula e as posições do botão corretamente quando o aplicativo iniciar com o dispositivo no modo paisagem ou retrato.

O problema é quando o dispositivo é girado de um modo para outro, os botões não ajustam as posições porque o uabableViewCell é reutilizável. Em outras palavras, a célula não é inicializada com base na nova largura do UitalBeview, porque a função da célula initwithstyle é chamada antes que o dispositivo seja girado e não seja chamado novamente após a rotação do dispositivo. Alguma sugestão?

Foi útil?

Solução 2

Depois de passar horas de pesquisa (incluindo postagens neste site), não consegui encontrar nenhuma soluções. Mas uma lâmpada acende de repente. A solução é muito simples. Basta detectar se a orientação do dispositivo é o modo de paisagem ou retrato e definir o reusableCellIdentifier com um nome diferente para cada um.

static NSString*Identifier;

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


    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:Identifier];

Outras dicas

Como o uabableViewCell também é um UIView, você pode substituir o método SetFrame. Toda vez que a visualização da sua tabela gira, esse método será chamado para todas as células.

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

    //Do your rotation stuffs here :)
} 

A resposta anterior tem um problema sério. Você deve usar [uiapplication sharedApplication] .statusBarorientation em vez de [uidevice currebtDevice] .Orientação porque a orientação do dispositivo não tem nada a ver com orientação da interface - a orientação do dispositivo é uma rotação física com base no acelerômetro.

A resposta marcada funciona como um charme nas versões antigas do iOS. Para o iOS 6.0, usei o próximo código:

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

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:Identifier];

Você precisará consertar a largura do quadro das células (assumindo cellForRowAtIndexPath método. Isso é o que está funcionando aqui. Eu costumava criar um TableViewCell personalizado com IB e ele sempre é inicializado para a largura do retrato de 320 px. Com a definição do quadro, ele funciona como esperado, mesmo que a célula seja "reutilizada" da fila.

- (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);
 ...
}

Eu tive um problema semelhante e este post me ajudou. No meu caso, tenho uma classe personalizada declarada em um arquivo separado e, neste arquivo, tenho o seguinte código em 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
}

Então, no meu controlador de visualização, acabei de implementar willAnimateRotationToInterfaceOrientation: e envie o reloadData Mensagem para a minha tabela View.

Com isso eu não tenho que tocar o cellForRow método.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top