Saya telah menemukan bahwa pengguliran viewWillAppear
mungkin tidak bekerja dengan andal karena tampilan koleksi belum menyelesaikan tata letaknya; Anda mungkin menggulir ke item yang salah.
Saya juga menemukan bahwa menggulir ke dalam viewDidAppear
akan menyebabkan kilatan sesaat dari tampilan yang tidak digulirkan terlihat.
Dan, jika Anda menggulir setiap kali viewDidLayoutSubviews
, pengguna tidak akan dapat menggulir secara manual karena beberapa tata letak koleksi menyebabkan tata letak subview setiap kali Anda menggulir.
Inilah yang menurut saya berfungsi dengan andal:
Tujuan 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];
}
}
Swift:
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
if (!self.initialScrollDone) {
self.initialScrollDone = true
self.testNameCollectionView.scrollToItem(at:selectedIndexPath, at: .centeredHorizontally, animated: true)
}
}
initialScrollDone
bendera seperti yang telah dilakukan LenK karena metode ini akan dipanggil lebih dari sekali dan jika Anda memanggil scrollToItemAtIndexPath: lebih dari sekali tampaknya membuat collectionView tidak dapat digulung (simulator iOS iPhone 5 / iOS 8)[self.collectionView layoutIfNeeded];
sebelumnya, yang juga berfungsi saat Anda melakukan ini di dalamviewDidLoad
.Jawaban Baru yang Diedit:
Tambahkan ini
viewDidLayoutSubviews
CEPAT
Biasanya,
.centerVertically
demikianlah kasusnyaObjC
Jawaban lama berfungsi untuk iOS lama
Tambahkan ini di
viewWillAppear
:sumber
indexPath
:[NSIndexPath indexPathForItem:numberOfTheObject inSection:sectionNumber]
Saya sangat setuju dengan jawaban di atas. Satu-satunya hal adalah bagi saya solusinya adalah mengatur kode di viewDidAppear
Ketika saya menggunakan viewWillAppear, pengguliran tidak berfungsi.
sumber
ini sepertinya berhasil untuk saya, ini mirip dengan jawaban lain tetapi memiliki beberapa perbedaan berbeda:
sumber
Cepat:
Cepat 3
Posisi Gulir:
sumber
Anda dapat menggunakan GCD untuk mengirimkan scroll ke iterasi berikutnya dari run loop utama di viewDidLoad untuk mencapai perilaku ini. Gulir akan dilakukan sebelum tampilan koleksi ditampilkan di layar, jadi tidak akan ada flashing.
sumber
Saya akan merekomendasikan melakukannya di.
collectionView: willDisplay:
Kemudian Anda dapat yakin bahwa delegasi tampilan koleksi mengirimkan sesuatu. Berikut contoh saya:sumber
Sebagai alternatif yang disebutkan di atas. Panggilan setelah pemuatan data:
Cepat
sumber
Semua jawaban di sini - peretasan. Saya telah menemukan cara yang lebih baik untuk menggulir tampilan koleksi di suatu tempat setelah relaodData:
Tata letak tampilan koleksi subkelas tata letak apa pun yang pernah Anda gunakan, timpa metode preprepLayout, setelah panggilan super mengatur apa pun yang Anda butuhkan.
mis .: https://stackoverflow.com/a/34192787/1400119
sumber