Cara menonaktifkan gulir di tabel UITableView ketika kontennya pas di layar


240

Saya memiliki beberapa tabel (gaya dikelompokkan) di aplikasi iphone saya (hanya pada bagian layar dan ditambahkan dengan Interface Builder, tidak disubklasifikasikan dari UITableViewController) bahwa 80% dari waktu kecil dan akan cocok di layar. Ketika tabel pas di layar, saya ingin menonaktifkan pengguliran, untuk membuatnya sedikit lebih bersih. Tetapi jika tabel keluar dari layar (ketika baris kemudian ditambahkan ke dalamnya), saya ingin mengaktifkan gulir lagi (karena jika tidak Anda tidak dapat melihat konten itu.)

Apakah ada cara untuk melakukan ini? Sepertinya saya tidak bisa memahaminya. Saya tahu harus melakukan:

tableView.scrollEnabled = NO;

tapi saya tidak yakin di mana, atau jika saya harus menghitung ukuran objek tabel atau sesuatu untuk mendapatkan ini berfungsi.


Pembaruan : Inilah solusi yang akhirnya berhasil untuk saya:

if (table.contentSize.height < table.frame.size.height) {
   table.scrollEnabled = NO;
 }
else {
   table.scrollEnabled = YES;
 }

Saya menjalankan kode ini setelah menelepon reloadData di atas meja, dan menghitung ukuran yang tepat dan tampaknya berfungsi.

table.frame.size.heightadalah ukuran sebenarnya dari objek (Anda bisa melihatnya di Interface Builder) ditampilkan di layar, sedangkan table.contentSize.heightadalah ketinggian: header, footer, dan tinggi setiap sel ditambahkan bersama-sama.


1
Terima kasih. Solusi itu berhasil untuk saya. Namun, saya akhirnya memperluas UITableView dan mengganti reloadData untuk menonaktifkan scrollEnabled. Alasannya adalah bahwa tampilan tabel dimuat ketika pengontrol tampilan saya dibuat. Dengan begitu Anda tidak perlu memanggil reloadData dua kali.
Brandon O'Rourke

@ JoBlow Saya pikir Anda melewatkan poin OP. Pertanyaannya bukan bagaimana cara menonaktifkan bounce, melainkan bagaimana cara mengaktifkan scrolling (dan bounce, kemungkinan besar) ketika tableview perlu digulir.
Kyle Clegg

Mungkin lebih baik menggunakan batas, karena saya pikir jika Anda memutar sedikit meja Anda, frame. Height akan berubah.
Ricardo

Seharusnya ada: if (table.contentSize.height <= table.frame.size.height)
Grzegorz Krukowski

Jawaban:


396

Saya pikir Anda ingin mengatur

tableView.alwaysBounceVertical = NO;

6
Ini berfungsi lebih baik daripada contentSize <bingkai ketika Anda menggunakan AutoLayout. Harus diterima jawaban.
Joshua Dance

1
Saya menggunakan tata letak otomatis dan jawaban ini persis apa yang saya butuhkan.
Golden Thumb

3
lebih baik daripada menonaktifkan scrolling
Kirit Vaghela

5
berfungsi seperti jimat, Anda juga dapat menonaktifkannya dari interface builderdengan melepas bouncing dan bouncing secara horizontal / vertikal.
Ahsan Ebrahim

11
untuk Swift - tableView.alwaysBounceVertical = false
swiftBoy

44

Anda dapat memverifikasi jumlah sel yang terlihat menggunakan fungsi ini:

- (NSArray *)visibleCells

Metode ini akan mengembalikan array dengan sel-sel yang terlihat, sehingga Anda dapat menghitung jumlah objek dalam array ini dan membandingkannya dengan jumlah objek di tabel Anda .. jika itu sama .. Anda dapat menonaktifkan pengguliran menggunakan:

tableView.scrollEnabled = NO;

Seperti yang disebutkan @Ginny .. kita akan memiliki masalah dengan sel yang terlihat sebagian, jadi solusi ini berfungsi lebih baik dalam hal ini:

tableView.scrollEnabled = (tableView.contentSize.height <= CGRectGetHeight(tableView.frame));

Jika Anda menggunakan autoLayout solusi ini melakukan pekerjaan:

tableView.alwaysBounceVertical = NO.

Terima kasih! Ini sebagian besar bekerja untuk saya sekarang. Satu-satunya masalah yang saya alami sekarang adalah ketika sel terlihat sebagian, mereka masih dihitung sebagai terlihat dan dengan demikian bergulir dinonaktifkan ketika dalam kasus itu saya ingin itu diaktifkan.
Ginny

6
Menemukannya! Ternyata Anda tidak bisa benar-benar menggunakan sel kasat mata, karena masalah sel yang terlihat sebagian, tetapi ini berfungsi: if (table.contentSize.height < table.frame.size.height)>> lihat edit di posting asli.
Ginny

42

Dalam Swift:

tableView.alwaysBounceVertical = false

18
Saya selalu mengunggah "penulisan ulang" a̶n becauses̶w̶e̶r̶s̶ ini karena mengonversi ke sintaksis modern memerlukan waktu.
Dmitry Isaev

14

Jadi ada beberapa jawaban dan memerlukan semua konten sekaligus, jadi saya menambahkan jawaban ini:

Jika Anda menggunakan AutoLayout, dengan menyetel ini hanya akan berfungsi untuk Anda:

  • Dalam kode:

tableView.alwaysBounceVertical = false

  • atau Di Interface Builder:

Temukan saja opsi ini dan untick " Bounce Vertically".

Inilah rujukannya:

masukkan deskripsi gambar di sini

Jika Anda tidak menggunakan AutoLayout:

 override func viewDidLayoutSubviews() {
    // Enable scrolling based on content height
    tableView.isScrollEnabled = tableView.contentSize.height > tableView.frame.size.height
 }

13

coba ini

[yourTableView setBounces:NO];

@kyle - terima kasih atas catatannya! - tetapi lihat itulah yang terjadi secara otomatis. Jika lebih pendek dari layar (atau dudukan lain), itu TIDAK gulir (dan jelas tidak akan memantul, karena itu bahkan tidak akan gulir). Jika lebih panjang dari layar, maka akan bergulir (dan memang terpental). Tidak??
Fattie

Mungkin saya sudah terlalu banyak menggunakan tampilan koleksi ... mungkin ini berfungsi seperti yang saya jelaskan untuk tampilan koleksi, tetapi tidak untuk UITableView ??
Fattie

9

Anda dapat mengatur mengaktifkan / menonaktifkan bouncing atau menggulir tampilan tabel dengan memilih / membatalkan pilihan ini di area Scroll View

Gulir Lihat area pengeditan


3

Anda dapat mengedit ini di storyboard Anda (jika Anda menggunakannya). Di bawah tampilan tabel ada kotak centang yang mengatakan "Scrolling Enabled". Hapus centang dan selesai.


3

// Enable scrolling based on content height self.tableView.scrollEnabled = table.contentSize.height > table.frame.size.height;


3
Saya pikir saya tercerahkan setelah membaca solusi Anda. Terima kasih banyak
Arash

Saya menggunakan ini di viewDidAppear saya
Maria

1
Maksud saya viewDidLayoutSubviews tidak viewDidAppear
Maria

0

Ketinggian default adalah 44.0f untuk sel tampilan tabel yang saya percaya. Anda harus memiliki sumber data di Array? Kemudian cukup periksa apakah [array count]*44.0fmelampaui batas frame dan jika demikian atur tableview.scrollEnabled = NO, lain atur ke YA. Lakukan di mana Anda mencari sumber data untuk tampilan tabel tertentu.


Sel tabel saya adalah ukuran yang berbeda (dan dapat berubah ukuran kapan saja; Saya menggunakan metode heightForRowAtIndexPath) jadi saya mungkin tidak ingin hardcode 44.0f. Saya percaya angka itu sama dengan tableView.rowHeight?
Ginny

Anda kemudian akan melakukan perhitungan tinggi total Anda dalam metode itu. Sederhana bukan? Jika melebihi batas layar, aktifkan gulir, jika tidak biarkan dinonaktifkan. Metode ini akan dipanggil untuk semua sel yang terlihat. Jika Anda tidak memiliki cukup data untuk melampaui layar, Anda dapat menghitung tinggi total tepat di metode itu. Terus tambahkan ke variabel global ketinggian yang dikembalikan pada setiap panggilan dan Anda memiliki tinggi total Anda.
Bourne

Jawaban Roberto adalah cara yang lebih mudah untuk mencapai semua ini dan menyerahkan perhitungan ke tampilan tabel.
Bourne
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.