Como desativar a rolagem na tabela UITableView quando o conteúdo cabe na tela

240

Eu tenho algumas tabelas (estilo agrupado) no meu aplicativo para iPhone (apenas em parte da tela e adicionadas com Interface Builder, embora não subclassificadas UITableViewController), que 80% das vezes são pequenas e cabem na tela. Quando a mesa couber na tela, eu gostaria de desativar a rolagem, para torná-la um pouco mais limpa. Mas se a tabela sair da tela (quando as linhas forem adicionadas posteriormente a ela), gostaria de ativar a rolagem novamente (porque, caso contrário, você não poderá ver esse conteúdo).

Existe uma maneira de fazer isso? Não consigo entender. Eu sei fazer:

tableView.scrollEnabled = NO;

mas não tenho certeza de onde, ou se tenho que calcular o tamanho do objeto da tabela ou algo assim para que isso funcione.


Atualização : Aqui está a solução que finalmente funcionou para mim:

if (table.contentSize.height < table.frame.size.height) {
   table.scrollEnabled = NO;
 }
else {
   table.scrollEnabled = YES;
 }

Eu executo esse código depois de chamar reloadDataa tabela, que calcula os tamanhos certos e parece funcionar.

table.frame.size.heighté o tamanho real do objeto (você pode ver isso Interface Builder) exibido na tela, enquanto table.contentSize.heightas alturas de: cabeçalho, rodapé e altura de cada célula somadas.

Ginny
fonte
1
Obrigado. Essa solução funcionou para mim. No entanto, acabei estendendo o UITableView e substituindo reloadData para desativar o scrollEnabled. O motivo é que a exibição da tabela é carregada quando meu controlador de exibição é criado. Dessa forma, você não precisa chamar reloadData duas vezes.
Brandon O'Rourke
@ JoeBlow Eu acho que você perdeu o argumento da OP. A questão não é como desativar o salto, é como ativar a rolagem (e provavelmente o salto) quando a tableview precisar rolar.
Kyle Clegg
Talvez seja melhor usar limites, porque acho que se você girar um pouco sua mesa, o quadro. A altura vai mudar.
Ricardo
Deveria haver: if (table.contentSize.height <= table.frame.size.height)
Grzegorz Krukowski

Respostas:

395

Eu acho que você quer definir

tableView.alwaysBounceVertical = NO;
Lily Ballard
fonte
6
Isso funciona melhor que o contentSize <frame quando você estiver usando o AutoLayout. Deve ser aceita resposta.
Joshua Dance
1
Estou usando o layout automático e esta resposta é exatamente o que eu preciso.
Golden Thumb
3
melhor do que a desativação de rolagem
Kirit Vaghela
5
funciona como um encanto, você também pode desativá-lo interface builderdesmarcando o salto e o salto horizontal / verticalmente.
Ahsan Ebrahim
11
para Swift - tableView.alwaysBounceVertical = false
swiftBoy
44

Você pode verificar o número de células visíveis usando esta função:

- (NSArray *)visibleCells

Este método retornará uma matriz com as células visíveis, para que você possa contar o número de objetos nessa matriz e comparar com o número de objetos na sua tabela .. se for igual .. você pode desativar a rolagem usando:

tableView.scrollEnabled = NO;

Como o @Ginny mencionou .. poderíamos ter problemas com células parcialmente visíveis, portanto, esta solução funciona melhor neste caso:

tableView.scrollEnabled = (tableView.contentSize.height <= CGRectGetHeight(tableView.frame));

Caso você esteja usando o autoLayout, esta solução faça o trabalho:

tableView.alwaysBounceVertical = NO.
Roberto Ferraz
fonte
Obrigado! Isso está funcionando principalmente para mim agora. O único problema que estou tendo agora é que, quando as células estão parcialmente visíveis, elas ainda contam como visíveis e, portanto, a rolagem é desativada quando, nesse caso, eu quero que ela seja ativada.
Ginny
6
Descobri isso! Acontece que você realmente não pode usar o visibleCells, devido ao problema parcialmente visível da célula, mas isso funciona: if (table.contentSize.height < table.frame.size.height)>> veja editar na postagem original.
Ginny
42

Em Swift:

tableView.alwaysBounceVertical = false
Natividad Lara Diaz
fonte
18
Eu sempre voto positivo em tais "reescritas" porque a conversão para a sintaxe moderna exige tempo.
Dmitry Isaev
14

Portanto, existem várias respostas e requer todo o conteúdo de uma só vez, então estou adicionando esta resposta:

Se você estiver usando o AutoLayout, definindo isso só deve funcionar para você:

  • Em código:

tableView.alwaysBounceVertical = false

  • ou No Interface Builder:

Basta encontrar esta opção e a opção untick" Bounce Vertically".

Aqui está a referência:

insira a descrição da imagem aqui

Se você não estiver usando o AutoLayout:

 override func viewDidLayoutSubviews() {
    // Enable scrolling based on content height
    tableView.isScrollEnabled = tableView.contentSize.height > tableView.frame.size.height
 }
Hemang
fonte
13

tente isso

[yourTableView setBounces:NO];
codercat
fonte
@ kyle - obrigado pela nota! - mas veja, é o que acontece automaticamente. Se for mais curto que a tela (ou outro suporte), NÃO rola (e obviamente não salta, porque nem rolará). Se for maior que a tela, ela será rolada (e de fato retornará). Não??
Fattie 11/09/14
Talvez eu esteja usando muito visualizações de coleção ... talvez funcione como eu descrevi para visualizações de coleção, mas não para UITableView?
Fattie 11/09/14
9

Você pode ativar / desativar o retorno ou a rolagem da tableview, selecionando / desmarcando-a na área Scroll View

Área de edição Scroll View

Akila Wasala
fonte
3

Você pode editar isso no seu storyboard (se estiver usando um). Sob a exibição de tabela, há uma caixa de seleção que diz "Rolagem ativada". Desmarque e pronto.

ericmarkmartin
fonte
3

// Enable scrolling based on content height self.tableView.scrollEnabled = table.contentSize.height > table.frame.size.height;

rjobidon
fonte
3
Acho que fui esclarecido depois de ler sua solução. Muito obrigado
Arash
Eu usei isso no meu viewDidAppear
Maria
1
Eu quis dizer viewDidLayoutSubviews not viewDidAppear
Maria
0

A altura padrão é 44.0f para uma célula de tableview, acredito. Você deve ter sua fonte de dados em mãos em uma matriz? Depois, verifique se [array count]*44.0fvai além dos limites do quadro e, se estiver definido tableview.scrollEnabled = NO, defina-o como SIM. Faça onde você descobrir a fonte de dados para aquela visualização de tabela específica.

Bourne
fonte
Minhas células da tabela são de tamanhos diferentes (e podem mudar de tamanho a qualquer momento; estou usando o método heightForRowAtIndexPath), portanto provavelmente não gostaria de codificar 44.0f. Acredito que esse número seja o mesmo que tableView.rowHeight, afinal?
Ginny
Você faria o cálculo da altura total nesse método. Simples né? Se isso exceder o limite da tela, ative a rolagem e deixe-a desativada. O método seria chamado para todas as células visíveis. Se você não tiver dados suficientes para exceder a tela, poderá calcular a altura total exatamente nesse método. Continue adicionando a uma variável global a altura que ela retorna em cada chamada e você terá sua altura total.
Bourne
A resposta de Roberto é uma maneira mais fácil de conseguir tudo isso e deixar o cálculo para a tableview.
Bourne