Como posso fazer uma UIScrollView
rolagem para a parte inferior do meu código? Ou de uma maneira mais genérica, para qualquer ponto de uma subvisão?
ios
objective-c
swift
uiscrollview
nico
fonte
fonte
CGPoint bottomOffset = CGPointMake(0, self.scrollView.contentSize.height - self.scrollView.bounds.size.height + self.scrollView.contentInset.bottom);
contentSize
for menor quebounds
. Por isso deve ser assim:scrollView.setContentOffset(CGPointMake(0, max(scrollView.contentSize.height - scrollView.bounds.size.height, 0) ), animated: true)
let bottomOffsetY = max(collectionView.contentSize.height - collectionView.bounds.height + collectionView.contentInset.bottom, 0)
Versão rápida da resposta aceita para facilitar a colagem de cópias:
fonte
Solução mais simples:
fonte
Apenas um aprimoramento para a resposta existente.
Ele também cuida da parte inferior inferior (caso você esteja usando isso para ajustar a visualização de rolagem quando o teclado estiver visível)
fonte
Uma implementação rápida:
use-o:
fonte
Definir o deslocamento do conteúdo para a altura do tamanho do conteúdo está errado: ele rola a parte inferior do conteúdo para o topo da visualização de rolagem e, portanto, fora de vista.
A solução correta é rolar a parte inferior do conteúdo até a parte inferior da visualização de rolagem, desta forma (
sv
é o UIScrollView):fonte
if (sv.contentOffset.y + csz.height > bsz.height) {
?setContentOffset:
comando que é importante.Uma solução Swift 2.2, levando
contentInset
em consideraçãoIsso deve estar em uma extensão
Observe que você pode verificar se
bottomOffset.y > 0
antes de rolarfonte
E se
contentSize
for menor quebounds
?Para Swift é:
fonte
Role para cima
Role para baixo
fonte
Eu também encontrei outra maneira útil de fazer isso no caso de você estar usando uma UITableview (que é uma subclasse de UIScrollView):
fonte
Usando a
setContentOffset:animated:
função do UIScrollView para rolar para baixo no Swift.fonte
Parece que todas as respostas aqui não levaram em consideração a área segura. Desde o iOS 11, o iPhone X apresentou uma área segura. Isso pode afetar o scrollView
contentInset
.Para iOS 11 e superior, role a página corretamente para baixo com o conteúdo incluído. Você deve usar em
adjustedContentInset
vez decontentInset
. Verifique este código:contentOffset.x
):Referências:
fonte
Com um (opcional)
footerView
econtentInset
, a solução é:fonte
Rápido:
Você pode usar uma extensão como esta:
Usar:
fonte
valdyr, espero que isso ajude você:
fonte
Categoria para o resgate!
Adicione isso a um cabeçalho de utilitário compartilhado em algum lugar:
E então para a implementação desse utilitário:
Em seguida, implemente-o onde quiser, por exemplo:
fonte
Para ScrollView horizontal
Se você gosta de mim tem um ScrollView horizontal e deseja rolar até o final (no meu caso, à direita), é necessário alterar algumas partes da resposta aceita:
Objetivo-C
Rápido
fonte
Se você alterar de alguma forma o scrollView contentSize (por exemplo, adicionar algo ao stackView que está dentro do scrollView), você deve chamar
scrollView.layoutIfNeeded()
antes de rolar, caso contrário, não fará nada.Exemplo:
fonte
Uma boa maneira de garantir que a parte inferior do seu conteúdo fique visível é usar a fórmula:
Isso garante que a borda inferior do seu conteúdo esteja sempre igual ou acima da borda inferior da visualização. Isso
MIN(0, ...)
é necessário porqueUITableView
(e provavelmenteUIScrollView
) garantecontentOffsetY >= 0
quando o usuário tenta rolar visivelmentecontentOffsetY = 0
. Isso parece muito estranho para o usuário.O código para implementar isso é:
fonte
Se você não precisa de animação, isso funciona:
fonte
Embora a
Matt
solução me pareça correta, é necessário levar em conta também a exibição da coleção, se houver uma que foi configurada.O código adaptado será:
fonte
Em rápida:
fonte
Solução para rolar para o último item de uma tabela
Swift 3:
fonte
Não funcionou para mim, quando eu tentei usá-lo em
UITableViewController
onself.tableView
(iOS 4.1)
, após a adiçãofooterView
. Rola para fora das bordas, mostrando a tela preta.Solução alternativa:
fonte
fonte
Descobri que
contentSize
isso realmente não reflete o tamanho real do texto; portanto, ao tentar rolar para o final, ficará um pouco fora. A melhor maneira de determinar o tamanho real conteúdo é realmente usar oNSLayoutManager
'susedRectForTextContainer:
método:Para determinar quanto texto realmente é mostrado no
UITextView
, você pode calculá-lo subtraindo as inserções do contêiner de texto da altura do quadro.Então fica fácil rolar:
Alguns números para referência sobre o que os diferentes tamanhos representam para um vazio
UITextView
.fonte
Estenda o UIScrollView para adicionar um método scrollToBottom:
fonte
Versão Xamarin.iOS da resposta aceita
fonte
Versão Xamarin.iOS
UICollectionView
da resposta aceita para facilitar a cópia e a colagemfonte