Gire um UableViewCell personalizado
-
21-09-2019 - |
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?
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.