Descobri que a rolagem viewWillAppear
pode não funcionar de maneira confiável porque a visualização da coleção ainda não terminou seu layout; você pode rolar para o item errado.
Também descobri que rolar para dentro viewDidAppear
fará com que um flash momentâneo da exibição não rolada fique visível.
E, se você rolar toda vez viewDidLayoutSubviews
, o usuário não conseguirá rolar manualmente porque alguns layouts de coleção causam um layout de subvisualização toda vez que você rola.
Aqui está o que eu descobri que funciona de maneira confiável:
Objetivo C:
- (void)viewDidLayoutSubviews {
[super viewDidLayoutSubviews];
// If we haven't done the initial scroll, do it once.
if (!self.initialScrollDone) {
self.initialScrollDone = YES;
[self.collectionView scrollToItemAtIndexPath:self.myInitialIndexPath
atScrollPosition:UICollectionViewScrollPositionRight animated:NO];
}
}
Rápido :
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
if (!self.initialScrollDone) {
self.initialScrollDone = true
self.testNameCollectionView.scrollToItem(at:selectedIndexPath, at: .centeredHorizontally, animated: true)
}
}
initialScrollDone
sinalizador como LenK fez, uma vez que este método será chamado mais de uma vez e se você chamar scrollToItemAtIndexPath: mais de uma vez, parece tornar a collectionView não rolável (simulador iOS iPhone 5 / iOS 8)[self.collectionView layoutIfNeeded];
antes, o que também funciona quando você faz isso por dentroviewDidLoad
.Resposta nova e editada:
Adicione isto em
viewDidLayoutSubviews
RÁPIDO
Normalmente,
.centerVertically
é o casoObjC
Resposta antiga funcionando para iOS mais antigo
Adicione isto em
viewWillAppear
:fonte
indexPath
:[NSIndexPath indexPathForItem:numberOfTheObject inSection:sectionNumber]
Eu concordo totalmente com a resposta acima. A única coisa é que para mim a solução foi definir o código em viewDidAppear
Quando usei o viewWillAppear a rolagem não funcionou.
fonte
isso pareceu funcionar para mim, é semelhante a outra resposta, mas tem algumas diferenças distintas:
fonte
Rápido:
Swift 3
Posição de rolagem:
fonte
Você pode usar o GCD para despachar a rolagem para a próxima iteração do loop de execução principal em viewDidLoad para atingir esse comportamento. A rolagem será realizada antes que a visualização da coleção seja mostrada na tela, portanto, não haverá piscar.
fonte
Eu recomendaria fazer isso em
collectionView: willDisplay:
Então, você pode ter certeza de que o delegado de exibição de coleção oferece algo. Aqui meu exemplo:fonte
Como alternativa ao mencionado acima. Chamada após o carregamento de dados:
Rápido
fonte
Todas as respostas aqui - hacks. Eu encontrei uma maneira melhor de rolar a exibição de coleção em algum lugar após relaodData:
Layout de exibição de coleção de subclasse qualquer que seja o layout que você usar, sobrescrever o método prepareLayout, depois de super chamar definir o deslocamento de que você precisa.
por exemplo: https://stackoverflow.com/a/34192787/1400119
fonte