Como faço uma rolagem do UIScrollView para o topo?
ios
objective-c
iphone
uiscrollview
uikit
Jack Humphries
fonte
fonte
UIScrollView
contentInset
, infelizmente.[self.scrollView setContentOffset:CGPointMake(self.scrollView.contentOffset.x, -self.scrollView.contentInset.top) animated:YES];
faz o trabalho para mim[scrollView setContentOffset:CGPointMake(0, -scrollView.contentInset.top) animated:YES];
Funciona no iOS 6 e 7[scrollView setContentOffset:CGPointMake(0, scrollView.contentSize.height-scrollView.frame.size.height) animated:YES];
Aqui está uma extensão Swift que facilita:
Uso:
fonte
iOS 11 e superior
tente trabalhar com o novo
adjustedContentInset
.Por exemplo (role para o topo):
fonte
Para Swift 4
fonte
Usar
setContentOffset:animated:
fonte
Resposta para Swift 2.0 / 3.0 / 4.0 e iOS 7 ou superior:
fonte
No iOS7, tive problemas para obter uma visualização de rolagem específica para ir ao topo, que funcionava no iOS6, e usei isso para definir a visualização de rolagem para o topo.
fonte
Versão Swift 3.0.1 da resposta de rob mayoff :
fonte
Para replicar completamente o comportamento scrollToTop da barra de status, não apenas precisamos definir o contentOffset, mas também queremos garantir que os scrollIndicators sejam exibidos. Caso contrário, o usuário poderá se perder rapidamente.
O único método público para fazer isso é
flashScrollIndicators
. Infelizmente, chamá-lo uma vez após definir o contentOffset não tem efeito porque é redefinido imediatamente. Descobri que funciona sempre que o flash é disparadoscrollViewDidScroll:
.No seu UIScrollViewDelegate (ou UITable / UICollectionViewDelegate) implemente isto:
O atraso da ocultação é um pouco menor em comparação com o comportamento scrollToTop da barra de status, mas ainda parece bom.
Observe que estou abusando da tag view para comunicar o estado "isScrollingToTop" porque preciso disso nos controladores de exibição. Se você estiver usando tags para outra coisa, poderá substituí-lo por um iVar ou uma propriedade.
fonte
Acho que tenho uma resposta que deve ser totalmente compatível com o iOS 11 e com versões anteriores (para rolagem vertical)
Isso leva em consideração o novo ajustadoContentInset e também considera o deslocamento adicional necessário quando prefereLargeTitles está ativado na navegação, que parece exigir um deslocamento adicional de 52px sobre o valor padrão.
Isso foi um pouco complicado, pois o ajustadoContentInset muda dependendo do estado titleBar (título grande vs título pequeno), então eu precisei verificar e ver qual era a altura do titleBar e não aplicar o deslocamento de 52px se ele já estiver no estado grande. Não foi possível encontrar outro método para verificar o estado da barra de navegação. Se alguém tiver uma opção melhor do que ver se a altura é> 44,0, eu gostaria de ouvi-la
Inspirado na solução de Jakub
fonte
É muito comum quando a barra de navegação se sobrepõe à pequena parte do conteúdo do scrollView e parece que o conteúdo não começa da parte superior. Para corrigi-lo, fiz duas coisas:
fonte
Vá até o topo para
UITableViewController
,UICollectionViewController
ou qualquerUIViewController
terUIScrollView
fonte
No SWIFT 5, defina o deslocamento do conteúdo como zero.
fonte
Eu tentei de todas as maneiras. Mas nada funcionou para mim. Finalmente eu fiz assim.
Eu adicionei
self.view .addSubview(self.scroll)
linha de código no viewDidLoad. Após iniciar a configuração do quadro para a visualização de rolagem e adicionar componentes à visualização de rolagem.Funcionou para mim.
Certifique-se de adicionar uma
self.view .addSubview(self.scroll)
linha no começo. então você pode adicionar elementos da interface do usuário.fonte