Di meja saya melihat aku harus scroll ke atas. Tapi saya tidak bisa menjamin bahwa objek pertama akan menjadi bagian 0, baris 0. Mungkin yang saya tampilan tabel akan mulai dari bagian nomor 5.
Jadi saya mendapatkan pengecualian, ketika saya sebut:
[mainTableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:NO];
Apakah ada cara lain untuk menggulir ke bagian atas table view?
UITableView adalah sebuah subclass dari UIScrollView, sehingga anda juga dapat menggunakan:
[mainTableView scrollRectToVisible:CGRectMake(0, 0, 1, 1) animated:YES];
Atau
[mainTableView setContentOffset:CGPointZero animated:YES];
Dan di Swift:
mainTableView.setContentOffset(CGPointZero, animated:true)
Dan di Swift 3 & atas:
mainTableView.setContentOffset(.zero, animated: true)
Catatan: jawaban Ini isn't berlaku untuk iOS 11 dan kemudian.
Saya lebih suka
[mainTableView setContentOffset:CGPointZero animated:YES];
Jika anda memiliki inset atas di meja anda lihat, anda harus mengurangi itu:
[mainTableView setContentOffset:CGPointMake(0.0f, -mainTableView.contentInset.top) animated:YES];
Mungkin Tindakan:
Satu
func scrollToFirstRow() {
let indexPath = NSIndexPath(forRow: 0, inSection: 0)
self.tableView.scrollToRowAtIndexPath(indexPath, atScrollPosition: .Top, animated: true)
}
Dua
func scrollToLastRow() {
let indexPath = NSIndexPath(forRow: objects.count - 1, inSection: 0)
self.tableView.scrollToRowAtIndexPath(indexPath, atScrollPosition: .Bottom, animated: true)
}
Tiga
func scrollToSelectedRow() {
let selectedRows = self.tableView.indexPathsForSelectedRows
if let selectedRow = selectedRows?[0] as? NSIndexPath {
self.tableView.scrollToRowAtIndexPath(selectedRow, atScrollPosition: .Middle, animated: true)
}
}
Empat
func scrollToHeader() {
self.tableView.scrollRectToVisible(CGRect(x: 0, y: 0, width: 1, height: 1), animated: true)
}
Lima
func scrollToTop(){
self.tableView.setContentOffset(CGPointMake(0, UIApplication.sharedApplication().statusBarFrame.height ), animated: true)
}
Menonaktifkan Scroll Ke Atas:
func disableScrollsToTopPropertyOnAllSubviewsOf(view: UIView) {
for subview in view.subviews {
if let scrollView = subview as? UIScrollView {
(scrollView as UIScrollView).scrollsToTop = false
}
self.disableScrollsToTopPropertyOnAllSubviewsOf(subview as UIView)
}
}
Memodifikasi dan menggunakannya sesuai kebutuhan.
Swift 4
func scrollToFirstRow() {
let indexPath = IndexPath(row: 0, section: 0)
self.tableView.scrollToRow(at: indexPath, at: .top, animated: true)
}
It's lebih baik untuk tidak menggunakan NSIndexPath (meja kosong), atau berasumsi bahwa titik puncak adalah CGPointZero (konten insets), yang's apa yang saya gunakan -
[tableView setContentOffset:CGPointMake(0.0f, -tableView.contentInset.top) animated:YES];
Semoga ini bisa membantu.
Swift 4:
Ini bekerja sangat baik:
//self.tableView.reloadData() if you want to use this line remember to put it before
let indexPath = IndexPath(row: 0, section: 0)
self.tableView.scrollToRow(at: indexPath, at: .top, animated: true)
Pada iOS 11, menggunakan adjustedContentInset
untuk benar gulir ke atas untuk kedua kasus ketika di-hubungi status bar terlihat atau tidak.
if (@available(iOS 11.0, *)) {
[tableView setContentOffset:CGPointMake(0, -tableView.adjustedContentInset.top) animated:YES];
} else {
[tableView setContentOffset:CGPointMake(0, -tableView.contentInset.top) animated:YES];
}
Swift:
if #available(iOS 11.0, *) {
tableView.setContentOffset(CGPoint(x: 0, y: -tableView.adjustedContentInset.top), animated: true)
} else {
tableView.setContentOffset(CGPoint(x: 0, y: -tableView.contentInset.top), animated: true)
}
JANGAN GUNAKAN
tableView.setContentOffset(.zero, animated: true)
Hal ini dapat kadang-kadang mengatur offset tidak benar. Misalnya, dalam kasus saya, sel itu benar-benar sedikit di atas melihat dengan daerah aman insets. Tidak baik.
BUKAN MENGGUNAKAN
tableView.scrollToRow(at: IndexPath(row: 0, section: 0), at: .top, animated: true)
I've mengalami masalah memanggil mencoba beberapa metode pada kosong selimut
. Berikut ini's pilihan lain untuk Swift 4 yang menangani kosong tableviews.
extension UITableView {
func hasRowAtIndexPath(indexPath: IndexPath) -> Bool {
return indexPath.section < self.numberOfSections && indexPath.row < self.numberOfRows(inSection: indexPath.section)
}
func scrollToTop(animated: Bool) {
let indexPath = IndexPath(row: 0, section: 0)
if self.hasRowAtIndexPath(indexPath: indexPath) {
self.scrollToRow(at: indexPath, at: .top, animated: animated)
}
}
}
Penggunaan:
// from yourViewController or yourTableViewController
tableView.scrollToTop(animated: true)//or false
Untuk tabel yang memiliki contentInset
, pengaturan konten offset untuk CGPointZero
tidak akan bekerja. It'll gulir ke atas konten vs. bergulir ke atas meja.
Mengambil konten inset ke akun menghasilkan ini sebagai gantinya:
[tableView setContentOffset:CGPointMake(0, -tableView.contentInset.top) animated:NO];
Kode ini let's anda gulir ke bagian tertentu ke atas
CGRect cellRect = [tableinstance rectForSection:section];
CGPoint origin = [tableinstacne convertPoint:cellRect.origin
fromView:<tableistance>];
[tableinstance setContentOffset:CGPointMake(0, origin.y)];
Sejak saya selimut
penuh dari semua jenis insets, ini adalah satu-satunya hal yang bekerja dengan baik:
Swift 3
if tableView.numberOfSections > 0 && tableView.numberOfRows(inSection: 0) > 0 {
tableView.scrollToRow(at: IndexPath(row: 0, section: 0), at: .top, animated: true)
}
Swift 2
if tableView.numberOfSections > 0 && tableView.numberOfRowsInSection(0) > 0 {
tableView.scrollToRowAtIndexPath(NSIndexPath(forRow: 0, inSection: 0), atScrollPosition: .Top, animated: true)
}
Menambahkan pada apa yang's sudah bilang, anda dapat membuat ekstensi (Swift) atau kategori (Objective C) untuk membuat ini lebih mudah di masa depan:
Swift:
extension UITableView {
func scrollToTop(animated: Bool) {
setContentOffset(CGPointZero, animated: animated)
}
}
Setiap kali anda ingin gulir apapun yang diberikan tableView ke atas anda dapat memanggil kode berikut:
tableView.scrollToTop(animated: true)
Swift 3
tableView.setContentOffset(CGPoint.zero, animated: true)
jika tableView.setContentOffset
don't bekerja.
Gunakan:
tableView.beginUpdates()
tableView.setContentOffset(CGPoint.zero, animated: true)
tableView.endUpdates()
Swift :
jika anda don't memiliki tampilan header :
tableView.setContentOffset(CGPointMake(0, UIApplication.sharedApplication().statusBarFrame.height ), animated: true)
jika demikian :
tableView.setContentOffset(CGPointMake(0, -tableViewheader.frame.height + UIApplication.sharedApplication().statusBarFrame.height ), animated: true)
Berikut ini's apa yang saya gunakan untuk bekerja dengan benar pada iOS 11:
extension UIScrollView {
func scrollToTop(animated: Bool) {
var offset = contentOffset
if #available(iOS 11, *) {
offset.y = -adjustedContentInset.top
} else {
offset.y = -contentInset.top
}
setContentOffset(offset, animated: animated)
}
}
Saya menggunakan tabBarController dan saya memiliki beberapa bagian di tableview di setiap tab, jadi ini adalah solusi terbaik untuk saya.
extension UITableView {
func scrollToTop(){
for index in 0...numberOfSections - 1 {
if numberOfSections > 0 && numberOfRows(inSection: index) > 0 {
scrollToRow(at: IndexPath(row: 0, section: index), at: .top, animated: true)
break
}
if index == numberOfSections - 1 {
setContentOffset(.zero, animated: true)
break
}
}
}
}
Ini adalah satu-satunya potongan kode yang bekerja untuk saya
Swift 4:
tableView.scrollRectToVisible(CGRect(x: 0, y: 0, width: 1, height: 1), animated: true)
tableView.scrollToRow(at: IndexPath(row: 0, section: 0), at: .top, animated: true)
tableView.setContentOffset(CGPoint(x: 0, y: -70), animated: true)
P. S. 70 lebih tinggi dari saya header dan tampilan tabel cell