Eu tenho um UITableView
que é preenchido com células de altura variável. Eu gostaria que a tabela rolasse para baixo quando a visualização fosse exibida.
Atualmente, tenho a seguinte função
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:[log count]-1 inSection:0];
[self.table scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionBottom animated:NO];
log é uma matriz mutável que contém os objetos que compõem o conteúdo de cada célula.
O código acima funciona bem, no viewDidAppear
entanto, isso tem o efeito colateral infeliz de exibir a parte superior da tabela quando a exibição aparece pela primeira vez e depois pular para o fundo. Eu preferiria se o table view
pudesse ser rolado para baixo antes de aparecer.
Eu tentei a rolagem viewWillAppear
e, viewDidLoad
em ambos os casos, os dados ainda não foram carregados na tabela e ambos lançam uma exceção.
Qualquer orientação seria muito apreciada, mesmo que seja apenas um caso de me dizer o que tenho é tudo o que é possível.
fonte
[table reloadData];
CGPoint(x: 0, y: tableView.contentSize.height)
?Eu acho que a maneira mais fácil é esta:
Versão Swift 3:
fonte
messages.count
pelo já implementadomyTableView.dataSource!.tableView(myTableView, numberOfRowsInSection: 0)
. Sim, é mais longo, mas pode evitar a repetição de código. Você também precisa lidar com o opcionaldataSource
(não force a desembrulhar como nesta amostra).Da resposta de Jacob , este é o código:
fonte
UIEdgeInsetsInsetRect(self.messagesTableView.frame, self.messagesTableView.safeAreaInsets).height
Se você precisar rolar para o final EXATO do conteúdo, poderá fazer o seguinte:
fonte
yOffset = self.tableView.contentSize.height - self.tableView.bounds.size.height;
:? Obrigado.self.tableView.contentSize.height
o conteúdo da exibição de tabela, pode não estar visível, porque você rolar abaixo do conteúdo. Portanto, você precisa rolar para uma "lacuna visível da visualização da tabela" acima do final da visualização da tabela.Estou usando o layout automático e nenhuma das respostas funcionou para mim. Aqui está minha solução que finalmente funcionou:
fonte
setContentOffset
em outro momento em que os dados foram buscados e a tableview recarregada?CGFLOAT_MAX
, useicontentSize.height - frame.height + contentInset.bottom
ao definir o deslocamento do conteúdo inicial. UsarCGFLOAT_MAX
parecia me atrapalhar.A solução aceita pelo @JacobRelkin não funcionou para mim no iOS 7.0 usando o Auto Layout.
Eu tenho uma subclasse personalizada de
UIViewController
e adicionei uma variável de instância_tableView
como uma sub- visualização deleview
. Posicionei_tableView
usando o Auto Layout. Tentei chamar esse método no finalviewDidLoad
e até noviewWillAppear:
. Nem funcionou.Então, adicionei o seguinte método à minha subclasse personalizada de
UIViewController
.Ligando
[self tableViewScrollToBottomAnimated:NO]
no final dosviewDidLoad
trabalhos. Infelizmente, também faztableView:heightForRowAtIndexPath:
com que seja chamado três vezes para cada célula.fonte
Aqui está uma extensão que eu implementei no Swift 2.0. Essas funções devem ser chamadas após o
tableview
carregamento:fonte
Detalhes
Código
Uso
Amostra completa
fonte
Na verdade, uma maneira "mais rápida" de fazê-lo rapidamente é:
trabalho Perfeito para mim.
fonte
Eu queria que a tabela carregasse com o final da tabela mostrada no quadro. Eu achei usando
não funcionou porque deu um erro quando a altura da tabela era menor que a altura do quadro. Observe que minha tabela possui apenas uma seção.
A solução que funcionou para mim foi implementar o seguinte código no viewWillAppear:
O BOOL ivar initialLoad é configurado como TRUE em viewDidLoad.
fonte
scrollToRowAtIndexPath
em tudo? Você já está ligandosetContentOffset
depois, o que pode tornar a primeira chamada inútil.Para Swift:
fonte
Você deve usar em seu
UITableViewScrollPositionBottom
lugar.fonte
Para Swift 3 (Xcode 8.1):
fonte
É claro que é um bug. Provavelmente em algum lugar do seu código que você usa
table.estimatedRowHeight = value
(por exemplo, 100). Substitua esse valor pelo valor mais alto que você acha que uma altura de linha poderia obter , por exemplo, 500. Isso deve resolver o problema em combinação com o seguinte código:fonte
Depois de muitas brincadeiras, foi isso que funcionou para mim:
A chave acabou por ser não embrulho
scrollToRowAtIndexPath
dentro dedispatch_async
como alguns sugeriram, mas simplesmente segui-lo com uma chamada paralayoutIfNeeded
.Pelo que entendi, chamar o método de rolagem no encadeamento atual garante que o deslocamento da rolagem seja definido imediatamente, antes da exibição da exibição. Quando eu estava despachando para o encadeamento principal, a exibição foi exibida por um instante antes do rolagem entrar em vigor.
(Além disso, você precisa da
viewHasAppeared
bandeira, porque não deseja quegoToBottom
toda vez que elaviewDidLayoutSubviews
for chamada. É chamada, por exemplo, sempre que a orientação muda.)fonte
Usando as soluções acima, isso rolará para a parte inferior da sua tabela (somente se o conteúdo da tabela for carregado primeiro):
fonte
No Swift 3.0
fonte
Se você precisar carregar os dados de forma assíncrona antes de rolar para baixo, aqui está a solução possível:
fonte
Função no swift 3, role para baixo
fonte
você deveria adicionar
ou não rolará para baixo.
fonte
Use este código simples para rolar a tabela
fonte
Obrigado Jacob pela resposta. realmente útil se alguém interessante com monotouch c # versão
fonte
No iOS, isso funcionou bem para mim
Ele precisa ser chamado de
viewDidLayoutSubviews
fonte
[self.tableViewInfo scrollRectToVisible: CGRectMake (0, self.tableViewInfo.contentSize.height-self.tableViewInfo.height, self.tableViewInfo.width, self.tableViewInfo.height) animado: SIM];
fonte
A resposta aceita não funcionou com minha tabela (milhares de linhas, carregamento dinâmico), mas o código abaixo funciona:
fonte
Não há necessidade de rolagem; você pode fazer isso usando este código:
fonte
Se você estiver configurando o quadro para tableview programaticamente, verifique se está definindo o quadro corretamente.
fonte
No Swift, você só precisa
para rolar automaticamente para o botão
fonte
No swift 3.0 Se você deseja acessar qualquer célula específica da tableview, altere o valor do índice da célula, como o valor "self.yourArr.count".
fonte
Acredito que soluções antigas não funcionam com o swift3.
Se você souber o número de linhas na tabela, poderá usar:
fonte