İçerik ekrana sığdığında UITableView tablosunda kaydırma nasıl devre dışı bırakılır


240

Benim iphone app birkaç (gruplanmış tarzı) tablolar var (sadece ekranın bir parçası üzerinde ve Interface Builderolsa ile eklenir , alt sınıf değil UITableViewController) zaman% 80 küçük ve ekrana sığacak. Tablo ekrana sığdığında, biraz daha temiz hale getirmek için kaydırmayı devre dışı bırakmak istiyorum. Ancak tablo ekrandan çıkarsa (daha sonra satırlar eklendiğinde), tekrar kaydırmayı etkinleştirmek istiyorum (aksi takdirde bu içeriği göremezsiniz.)

Bunu yapmanın bir yolu var mı? Anlayamıyorum. Yapmayı biliyorum:

tableView.scrollEnabled = NO;

ama emin değilim, ya da ben tablo nesne boyutu ya da bir şey bu işe almak için hesaplamak zorunda.


Güncelleme : İşte sonunda benim için çalışan çözüm:

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

Bu kodu reloadDatamasaya çağırdıktan sonra çalıştırın ve doğru boyutları hesaplar ve çalışıyor gibi görünüyor.

table.frame.size.heightInterface Builderekranda görüntülenen nesnenin gerçek boyutudur (bunu içinde görebilirsiniz ), oysa table.contentSize.heightyükseklik, altbilgi ve toplanan her hücrenin yüksekliği.


1
Teşekkürler. Bu çözüm benim için çalıştı. Ancak, scrollEnabled devre dışı bırakmak için UITableView genişletme ve reloadData geçersiz kılma sona erdi. Bunun nedeni, görünüm denetleyicim oluşturulduğunda tablo görünümünün yüklenmesidir. Bu şekilde reloadData'yı iki kez çağırmanız gerekmez.
Brandon O'Rourke

@JoeBlow Bence OP'nin noktasını kaçırdınız. Soru, sıçramayı nasıl devre dışı bırakacağınız değil, yalnızca tablo görünümünün kaydırılması gerektiğinde kaydırmayı (ve büyük olasılıkla sıçramayı) nasıl etkinleştireceğinizdir.
Kyle Clegg

Belki sınırları kullanmak daha iyidir, çünkü bence tablonuzu biraz döndürürseniz, frame.height değişecektir.
Ricardo

Var olmalıdır: if (table.contentSize.height <= table.frame.size.height)
Grzegorz Krukowski

Yanıtlar:


396

Bence ayarlamak istiyorsun

tableView.alwaysBounceVertical = NO;

6
AutoLayout'u kullanırken, contentSize <çerçevesinden daha iyi çalışır. Cevap kabul edilmelidir.
Joshua Dance

1
Otomatik düzen kullanıyorum ve bu cevap tam olarak ihtiyacım olan şey.
Golden Thumb

3
kaydırma devre dışı bırakmak daha iyi
Kirit Vaghela

5
bir cazibe gibi çalışır, ayrıca interface buildersıçrama ve yatay / dikey sıçrama tekneyle devre dışı bırakabilirsiniz .
Ahsan Ebrahim

11
for Swift - tableView.alwaysBounceVertical = false
swiftBoy

44

Bu işlevi kullanarak görünür hücre sayısını doğrulayabilirsiniz:

- (NSArray *)visibleCells

Bu yöntem, görünür hücreler içeren bir dizi döndürür, böylece bu dizideki nesne sayısını sayabilir ve tablonuzdaki nesne sayısıyla karşılaştırabilirsiniz .. eşitse .. kaydırma özelliğini kullanarak devre dışı bırakabilirsiniz:

tableView.scrollEnabled = NO;

@Ginny'nin de belirttiği gibi, kısmen görünür hücrelerle sorun yaşayabiliriz, bu nedenle bu çözüm bu durumda daha iyi çalışır:

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

AutoLayout kullanıyorsanız bu çözüm işi yapın:

tableView.alwaysBounceVertical = NO.

Teşekkür ederim! Bu çoğunlukla benim için çalışıyor. Şu anda sahip olduğum tek sorun hücreler kısmen görünür olduğunda hala görünür olarak sayılır ve bu durumda etkinleştirilmesini istediğimde kaydırma devre dışı kalır.
Ginny

6
Anladım! Kısmen görünür hücre sorunu nedeniyle visibleCells'i gerçekten kullanamayacağınız ortaya çıkıyor, ancak bu işe yarıyor: if (table.contentSize.height < table.frame.size.height)>> orijinal yayında düzenleme bölümüne bakın.
Ginny

42

Swift'te:

tableView.alwaysBounceVertical = false

18
Modern sözdizimine dönüştürmek zaman gerektirir, çünkü böyle bir ̶n̶s̶w̶e̶r̶s̶ "yeniden yazar" her zaman vekalet ediyorum.
Dmitry Isaev

14

Bu yüzden birden fazla cevap var ve aynı anda tüm içeriği gerektiriyor, bu yüzden bu yanıtı ekliyorum:

AutoLayout'u kullanıyorsanız, bunu ayarlayarak yalnızca sizin için çalışması gerekir:

  • Kodda:

tableView.alwaysBounceVertical = false

  • veya Interface Builder'da:

Sadece bu seçeneği ve untick" Bounce Vertically" seçeneğini bulun .

İşte referans:

resim açıklamasını buraya girin

AutoLayout'u kullanmıyorsanız:

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

13

bunu dene

[yourTableView setBounces:NO];

@kyle - not için teşekkürler! - ama bak otomatik olarak olan bu. Ekrandan (veya başka bir tutucudan) daha kısaysa, KAYDIRMAZ (ve açıkçası sıçrama yapmaz, çünkü kaymaz bile). Ekrandan daha uzunsa, kaydırılır (ve gerçekten de sıçrar). Hayır??
Fattie

Belki toplama görünümlerini çok fazla kullanıyorum ... belki koleksiyon görünümleri için açıkladığım gibi çalışır, ancak UITableView için değil?
Fattie

9

Kaydırma Görünümü alanında bunları seçerek / seçimini kaldırarak, sekmeyi etkinleştirmeyi / devre dışı bırakmayı veya tablo görünümünü kaydırmayı ayarlayabilirsiniz

Kaydırma Görünümü düzenleme alanı


3

Bunu film şeridinizde düzenleyebilirsiniz (eğer kullanıyorsanız). Tablo görünümünün altında "Kaydırma Etkin" yazan bir onay kutusu vardır. İşaretini kaldırın ve işiniz bitti.


3

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


3
Sanırım çözümünüzü okuduktan sonra aydınlandım. Çok teşekkürler
Arash

Bunu benim görüşümde kullandım
Maria

1
Ben viewDidLayoutSubviews viewDidAppear demek istemedim
Maria

0

İnanıyorum ki bir tableview hücresi için varsayılan yükseklik 44.0f. Bir veri dizisinde veri kaynağınız elinizde mi olmalı? Sonra sadece [array count]*44.0fçerçeve sınırlarının ötesine geçip geçmediğini kontrol edin ve ayarlandıysa tableview.scrollEnabled = NO, bunu YES (EVET) olarak ayarlayın. Belirli bir tablo görünümü için veri kaynağını belirlediğiniz yerde yapın.


Benim tablo hücreleri farklı boyutlarda (ve herhangi bir zamanda boyutunu değiştirebilir; heightForRowAtIndexPath yöntemini kullanıyorum), bu yüzden muhtemelen 44.0f sabit kod istemiyorum. Bu sayı yine de tableView.rowHeight ile aynı olduğuna inanıyorum?
Ginny

Daha sonra bu yöntemde toplam yükseklik hesaplamanızı yaparsınız. Basit değil mi? Bu ekran sınırını aşarsa, kaydırmayı etkinleştir, aksi halde devre dışı bırakın. Tüm görünür hücreler için yöntem çağrılır. Ekranı aşacak yeterli veriye sahip değilseniz, toplam yüksekliği tam olarak bu yöntemde hesaplayabilirsiniz. Genel bir değişkene her çağrıda döndürdüğü yüksekliği eklemeye devam edin ve toplam yüksekliğiniz olsun.
Bourne

Roberto'nun cevabı, tüm bunları başarmanın ve hesaplamayı tablo görünümüne bırakmanın daha kolay bir yoludur.
Bourne
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.