Pergunta

Em um aplicativo que estou trabalhando, eu tenho um UITableView estilo simples que pode conter uma seção que contém zero linhas. Eu quero ser capaz de rolar a esta seção usando scrollToRowAtIndexPath: atScrollPosition: animado, mas eu recebo um erro quando tento de rolagem para esta seção, devido à falta de linhas criança

.

aplicativo de calendário da Apple é capaz de fazer isso, se você olhar para o seu calendário na vista de lista, e não há eventos no seu calendário para hoje, uma seção vazia é inserido por hoje e você pode rolar a ele usando o botão Hoje na barra de ferramentas na parte inferior da tela. Tanto quanto eu posso dizer a Apple pode estar usando um UITableView personalizado, ou eles estão usando uma API privada ...

A única solução que eu posso pensar é para inserir uma UITableCell vazio em que é 0 pixels de altura e de rolagem para isso. Mas é o meu entendimento de que ter células de diferentes alturas é muito ruim para rolagem desempenho. Ainda vou tentar de qualquer maneira, talvez o impacto no desempenho não será tão ruim.

Atualizar

Uma vez que não parece haver nenhuma solução para isso, eu tenho arquivado um relatório de bug com maçã. Se isso afeta você também, apresentar uma duplicata de rdar: // problema / 6263339 ( Abrir ligação Radar) se você quiser isso para obter este fixo mais rápido.

Atualização # 2

Eu tenho uma solução decente para esta questão, dê uma olhada na minha resposta abaixo.

Foi útil?

Solução

Atualização: Parece que esse bug foi corrigido no iOS 3.0. Você pode usar o seguinte NSIndexPath para se deslocar para uma seção contendo 0 linhas:

[NSIndexPath indexPathForRow:NSNotFound inSection:section]

Vou deixar a minha solução original aqui para qualquer um ainda manter um projeto usando o SDK 2.x.


Encontrada uma solução decente:

CGRect sectionRect = [tableView rectForSection:indexOfSectionToScrollTo];
[tableView scrollRectToVisible:sectionRect animated:YES];

O código acima irá percorrer o tableview de modo a seção desejada é visível, mas não necessariamente na parte superior ou inferior da área visível. Se você deseja rolar assim que a secção está no topo fazer isso:

CGRect sectionRect = [tableView rectForSection:indexOfSectionToScrollTo];
sectionRect.size.height = tableView.frame.size.height;
[tableView scrollRectToVisible:sectionRect animated:YES];

Modificar sectionRect como desejado para rolar a seção desejada para o fundo ou no meio da área visível.

Outras dicas

Esta é uma questão de idade, mas a Apple ainda não adicionou qualquer coisa que ajuda ou reparou o erro acidente em que a secção não tem linhas.

Para mim, eu realmente necessário para fazer uma nova seção de rolagem para o meio quando adicionado, assim que eu agora usar este código:

if (rowCount > 0) {
    [self.tableView scrollToRowAtIndexPath: [NSIndexPath indexPathForRow: 0 inSection: sectionIndexForNewFolder] 
                          atScrollPosition: UITableViewScrollPositionMiddle
                                  animated: TRUE];
} else { 
    CGRect sectionRect = [self.tableView rectForSection: sectionIndexForNewFolder];
    // Try to get a full-height rect which is centred on the sectionRect
    // This produces a very similar effect to UITableViewScrollPositionMiddle.
    CGFloat extraHeightToAdd = sectionRect.size.height - self.tableView.frame.size.height;
    sectionRect.origin.y -= extraHeightToAdd * 0.5f;
    sectionRect.size.height += extraHeightToAdd;
    [self.tableView scrollRectToVisible:sectionRect animated:YES];
}

Hope você como ele - ele é baseado no código Mike Akers' como você pode ver, mas faz o cálculo para a rolagem para o meio em vez de topo. Graças Mike - você é uma estrela

.

Uma abordagem Swift para o mesmo:

if rows > 0 {
    let indexPath = IndexPath(row: 0, section: section)
    self.tableView.setContentOffset(CGPoint.zero, animated: true)
    self.tableView.scrollToRow(at: indexPath, at: .top, animated: true)
}

else {
    let sectionRect : CGRect = tableView.rect(forSection: section)
    tableView.scrollRectToVisible(sectionRect, animated: true)
}

Não Se a sua seção têm linhas usar este

let indexPath = IndexPath(row: NSNotFound, section: section)
tableView.scrollToRow(at: indexPath, at: .middle, animated: true)

Eu acho que uma linha em branco é provavelmente a única maneira de ir para lá. É possível redesenhar a interface do usuário de modo que o "vazio" linha pode exibir algo útil?

Eu digo experimentá-lo, e ver o que o desempenho é semelhante. Eles dão avisos muito terríveis sobre o uso de sub-visualizações transparentes na sua lista itens, e eu não acho que isso importasse tanto assim em meu aplicativo.

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