Neden iOS7'de UITableViewStyleGrouped stiliyle UITableView'ımın üstünde ekstra dolgu var


635

İOS7'den başlayarak, tarzlarımın üstünde ek alan UITableViewvar UITableViewStyleGrouped.

İşte bir örnek:

resim açıklamasını buraya girin

Tablo görünümü ilk oktan başlar, açıklanamayan 35 piksel piksel vardır, ardından yeşil başlık UIViewdöndürülür viewForHeaderInSection(bölüm 0'dır).

Herkes bu 35 piksel miktarının nereden geldiğini ve geçiş yapmadan nasıl kurtulabileceğimi açıklayabilir UITableViewStylePlainmi?


Not:

İOS 11 ve sonraki sürümlerde:

tableView.contentInsetAdjustmentBehavior = .never

en yeni iOS 7'yi mi kullanıyorsunuz? Bu tutarsızlık TÜRLERİNİN bazıları (hepsi değil, belki de bu değil) sonraki dev önizlemelerinde iyileştirilmiştir. Bilmeliyim: Sorunları o kadar çok erteledim ki ortadan kayboldum.
Dan Rosenstark

Cevabı buradan kontrol edin - stackoverflow.com/a/18986158/1463604
Nishant

Kısa yanıt, bu fazladan dolgunluğun büyük olasılıkla tablo görünümü üstbilgisinden (bölüm üstbilgisi değil) kaynaklanmış UITableViewolması ve bunun 0,0 yüksekliğindeki bir üstbilgi atanmasını sevmemesidir. Kontrol stackoverflow.com/a/31223403/1394534 fazla ayrıntı için.
Aurelien Porte

30
self.tableView.tableHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 0.0f, CGFLOAT_MIN)];Not: 0.0fSadece bir ihmal sen rect'in yüksekliğinde kullanırsanız. Bu yüzden mümkün olan en yakın CGFloat'ı kullanıyoruz (en azından benim için "işe yaradı" ... sadece ideal bir çözüm değil).
Alejandro Iván

1
@ AlejandroIván yorumunuz sadece gecemi yaptı. Gruplandırılmış prototiplerle bir tableView var. NumberSections = data.count kullanıyorum ve numberRows = 1 ayarını kullanıyorum.
Ryan Alexander

Yanıtlar:


863

Aşağıdakiler bana yardımcı oldu:

YouStoryboard.storyboard> YouViewController> Nitelikler denetçisi> Seçimi kaldır - Kaydırma görünümü girişlerini ayarlayın.

resim açıklamasını buraya girin


42
Bu edgeInset değerleri ile kurcalamak yerine, bu dolgu kaldırmak için doğru bir yol olduğunu düşünüyorum.
Hgeg

21
Bu benim için işe yaramadı - yukarıda opak bir navBar var ve bu kapalı altındaki içeriği iter.
slycrel

5
Özel kullanılırken çalışmaz collectionview. ( collectionviewcell
Tableview içerideyken

5
Benim için çalışmadı;
shim

28
Bir kapsayıcı görünümü içinde bir TableViewController ile bu sorunu vardı. Bu özelliği doğrudan gömülü olan TableViewController'da değil, kapsayıcı görünümünü içeren görünüm denetleyicisinde ayarlamak zorunda kaldım. Sonra işe yaradı.
Andy Mortimer

325

Onunla biraz daha oynadım ve bu tableView'in ayarının bir yan etkisi gibi görünüyor tableHeaderView = nil.

Benim tableView dinamik olarak görünen tableHeaderViewolduğundan tableHeaderView, yerine gizlemek gerektiğinde self.tableView.tableHeaderView = nil;, ben yapmak:

self.tableView.tableHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, self.tableView.bounds.size.width, 0.01f)];

Bu çözümü biraz keyfi olarak ayarlamaktan daha çok seviyorum contentInset.topçünkü contentInset.topdinamik olarak da kullanıyorum. Yeniden hesapladığımda fazladan 35 piksel çıkarmayı hatırlamak zorunda olmak contentInset.topsıkıcıdır.


4
Harika bir çözüm! Gerçekten, kodunuzdaki gibi varsayılan tablo görünümü başlık görünümünden kurtulmak için 0.01f olarak ayarlamanız gerekir.
Simone Manganelli

2
BTW, bu aynı zamanda Arayüz Oluşturucu'da bir sürükle ve bırak ile de mümkündür. Her neyse, teşekkürler! :)
Rudolf Adamkovič

8
efendim bunun için bir madalya hak ediyor
Vaibhav Gautam

7
Tablo görünümünüzün üst kısmındaki 0,01f yükseklik görünümünün, tüm hücre gövdelerinin yanlış hizalandığı anlamına geleceğini unutmayın (ilk hücrenin 0,01 Y orijinli, diğeri cell_height + 0,01 vb.) Bu hücrelerin içeriği yanlış hizalanacaktır. ( Debug > Color Misaligned ImagesBunu kendiniz görmek için simülatörde açın .) Bunu yapmak istemezsiniz.
Simon Whitaker

2
UITableViewHeaderFooterViewUIView yerine kullanmak daha iyidir . Ve teoride CGFLOAT_MINaynı 0.01fama daha iyi çalışır .
Jaybo

178

IOS 7 için, bir görünüm denetleyicisinde tablo görünümü ayırıyorsanız, aşağıdakilere bakabilirsiniz:

self.edgesForExtendedLayout = UIRectEdgeNone;

senin sorunun benimkine benziyordu

Güncelleme:

İOS 9.x'te Swift:

self.edgesForExtendedLayout = UIRectEdge.None

Hızlı 3:

self.edgesForExtendedLayout = UIRectEdge.init(rawValue: 0)

3
Ovada çalıştım UITableView. Sorunlar benim UITableViewbir UIViewControlleriç olduğu gerçeğinden UINavigationControllerkaynaklanıyor ki tablo içeriği 44 puan düşmesine neden oldu, bu yüzden ilk içerik arkasında değildi navBar. Bu benim düzeni ile gerekli değildi, bu yüzden sadece sorunlara neden oldu. Sonunda automaticallyAdjustsScrollViewInsetsda çalıştı benim kod değiştirdi .
DBD

Bu özellik yalnızca UINavigationController gibi bir kaba gömülü denetleyicileri görüntülemek için uygulanır. Pencerenin kök görünümü denetleyicisi bu özelliğe tepki vermiyor. Bu özelliğin varsayılan değeri tümüdür. .. Varsayılanın 0 olması gerektiğini hissediyorum? Bunun bir avantajı var.
Desh_

5
Swift 3 ile daha zarif:edgesForExtendedLayout = []
Dave Batton

Hello @yeahdixon Pembe oku yapmak için hangi yazılımı kullanıyorsunuz? şimdiden teşekkürler
iArezki

174

Kaynağını devralınan contentInsetözelliği değiştirmeyi deneyin .UITableViewUIScrollView

self.tableView.contentInset = UIEdgeInsetsMake(-20, 0, 0, 0);

Bu bir çözüm, ama işe yarıyor


6
contentTableView.contentInset = UIEdgeInsetsMake(-20, 0, -20, 0);benim için en iyi sonucu verdi çünkü üstte ve altta fazladan 20 piksel vardı.
Brian

1
Her ne kadar bu "kaba kuvvet" çözümü işe yarıyor olsa da, alt olanların (özellikle otomatik olarak ayarlanan ekleri) daha yüksek sıralanması gerektiğini düşünüyorum.
eladleb

134
self.automaticallyAdjustsScrollViewInsets = NO;

deneyin, onunla başa çıkabilirim!


Bu, iOS 7.0'da tableHeaderView'ı gizlemek için harika çalışıyor, ancak eski sürümlerde desteklenmiyor.
Brian

İOS

3
Önemli: UITableView'ınız daha sonra başka bir denetleyiciye yerleştirilmiş bir denetleyiciye yerleştirildiyse bunu kapsayıcı görünümü denetleyicisinde yaptığınızdan emin olun, bunu doğrudan UITableView'ı (AutoLayout'un koyacağı) değil gömme üst denetleyicide yapın şeylere dikkat edin).
James Stone

Bu daha iyidir uncheck Adjust scroll view insets. Çünkü bazen kullanıcı arayüzümüzü oluşturmak için film şeridi kullanmıyoruz.
JW.ZG

Bu benim için çalışıyor. Gezinme çubuğuna ve tablo görünümüne görünüm ekledim, iOS 11'de olmadı, ancak iOS 10'da gerçekleşti.
dobiho

78

Uygulamanızın iOS7 veya daha üst bir sürümünü çalıştırıp çalıştırmadığını tespit edebilir ve bu iki yöntemi tablo görünümü temsilcinize ekleyebilirsiniz (genellikle UIViewController kodunuzda)

-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
    return CGFLOAT_MIN;
}

-(CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
    return CGFLOAT_MIN;
}

Bu belki de zarif bir çözüm değil ama benim için çalışıyor

Hızlı sürüm:

override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return CGFloat.leastNormalMagnitude
}

override func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
    return CGFloat.leastNormalMagnitude
}

1
Bu benim için çalıştı. UITableView, birçok farklı nedenden ötürü en üste yer açar. Özellikle, OP ile ilgili olarak, sorun yalnızca gruplandırılmış stil tablosu görünümünde olur. Ve bu çözüm sorunu çözdü.
RajV

5
0.001 yerine CGFLOAT_MIN kullanabilirsiniz CGFloat en küçük mutlak değerini verir.
eiKatte

2
Bu doğru yanıttır, çünkü gerçek özellik, doldurmanın yalnızca gruplandırılmış stil tablosu görünümünde olması ve üstbilgi / altbilgiyi belirtirseniz yoksayılmasıdır
Jakub Truhlář

Bu doğru cevap olarak işaretlenmelidir. Geçersiz kılmak için bir temsilci yöntemi ve bu soruya cevap verir. En azından bunu tüm hack'leri çok aşağı okursanız deneyin. Tweetlemeyi deneyin: - (CGFloat) tableView: (UITableView *) tableView heightForHeaderInSection: (NSInteger) bölümü {// return CGFLOAT_MIN; dönüş 30.0f; }
Matthew Ferguson

Güzel! Bonus olarak, üstte küçük bir başlık ve gruplandırılmış bölümler arasında daha fazlasını istiyorsanız, aşağıdakileri kullanabilirsiniz:override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { return section == 0 ? 14 : 24 }
Freek Sanders

55

Orijinal hatanın nedenini buldum ve bunu gösteren örnek bir proje oluşturdum. Bir iOS7 hatası olduğuna inanıyorum.

İOS7'den itibaren, Gruplanmış stille bir UITableView oluşturursanız, ancak ilk mizanpajda bir temsilci yoksa, bir temsilci ayarlayıp reloadData'yı çağırırsanız, en üstte asla kaybolmayacak 35 piksel alan olacaktır.

Hatayı sergilediğim bu projeye bakın: https://github.com/esilverberg/TableViewDelayedDelegateBug

Özellikle bu dosya: https://github.com/esilverberg/TableViewDelayedDelegateBug/blob/master/TableViewDelayedDelegateBug/ViewController.m

24. hat aktifse,

[self performSelector:@selector(updateDelegate) withObject:nil afterDelay:0.0];

üstte fazladan 35 piksel boşluk olacak. 27. satır aktifse ve 24 yorum yapılmışsa,

self.tableView.delegate = self;

üstte boşluk yok. TableView, bir sonucu bir yerde önbelleğe alıyor ve temsilci ayarlandıktan ve reloadData çağrıldıktan sonra kendini yeniden çizmiyor gibi.


21
Bir delege olsa da delege tableView:heightForHeaderInSection:ve tableView:heightForFooterInSection:0 döndürse bile , bu sorunla karşılaşacağınızı da ekleyeceğim. Yukarıdaki protokol yöntemlerini uygulamak ve 0.01f döndürmek benim için sabit.
John Estropia

1
EVET!! Ben 3 sözde çözümleri denedim ve bu biriydi! Mükemmel, teşekkürler: D
Henrik Erlandsson

mükemmel. Herkes bir hata bildirdi çünkü bunun amaçlanan davranış olmadığını düşünüyorum.
Pushparaj

büyük bulmak! Bu hala ios 9'da (XIB kullanmıyoruz) oluyor, ancak delegeyi init'e ayarlamak boşluğu düzeltti (loadView veya viewDIdLoad'da değil). Teşekkür ederim!
John Stricker

1
Başlık için tahmin edilen
Viktor

49

"Kaydırma Görünümü girişlerini ayarla" seçeneğinin işaretini kaldırın

resim açıklamasını buraya girin


Başka bir View Controller için benim bu seçeneğe ihtiyacım vardı ve görünüşe göre yeni bir VC yaptığımda, değişiklik devam etti. Bunun için teşekkürler!
David

Evet! Çalışıyor, justo ContainerView'da çalışıyor ve çalışıyor!
Felipe FMMobile

46

Başka bir hızlı yorum ... XCode 6.1'de bile UIScrollViews, UITextViewsve üstünde dikey boşlukların göründüğü bir hata var UITableViews.

resim açıklamasını buraya girin

Bazen bu sorunu çözmenin tek yolu, Storyboard'a gitmek ve sorun kontrolünü sürüklemek, böylece artık sayfadaki ilk alt görünüm değildir.

resim açıklamasını buraya girin

( Oded'e beni bu yönde işaret ettiği için teşekkür ederim ... Bu yorumu, sadece birkaç ekran görüntüsü eklemek, semptomları göstermek ve düzeltmek için gönderiyorum.)


1
Sayfanızdaki ilk alt kontrol olarak bir UITextView varsa, bu hatanın errrr sorununun iOS 8'de de gerçekleştiğini unutmayın ... bu sadece bir UITableView sorunu değildir.
Mike Gledhill

1
Tüm çözümlerden sadece bu hack benim için çalıştı. Tuhaf bir hataya garip bir çözüm. UITableview ile bu sorunla karşılaştım.
Mesbah

4
1 milyon teşekkür ederim! Benim için çalışan tek çözüm bu.
user139816

1
(18 ay sonra şaşırdım ve okuyucular hala bu cevabı oyluyorlar. Apple bu sorunu henüz ciddiye almıyor mu
?!

1
hayatımı kurtardı! Teşekkürler. Bu basit "düzeltmeyi" bulmanın ne kadar sürdüğünü biliyor musunuz? grrh.
Mc.Stever

40

Apple tarafından iOS7 için bu geçiş kılavuzuna göre , kaydırma görünümünün içerik ekleri otomatik olarak ayarlanır. AutomaticAdjustsScrollViewInsets öğesinin varsayılan değeri EVET olarak ayarlanmıştır.

UITableView olan UIViewController bu özelliği NO olarak ayarlamalıdır.

self.automaticallyAdjustsScrollViewInsets = NO;

Bu hile yapacak.

DÜZENLEME 1:

Ayrıca, deneyebilirsiniz -

self.navigationController.navigationBar.translucent = YES;

Bu, üst kısımdaki fazladan dolguyu da ortadan kaldırır.


Soruyu tam olarak cevaplamadığı sürece çok iyi bir cevap. Esilver 35 piksel boşluktan bahsediyor, ancak iOS7 durum çubuğu yüksekliğine eşit fazladan 20 piksel başlık ekliyor.
Martin

Saçma bir sorun. Cevap için teşekkürler.
Genki

Bu farklı bir sorunun cevabıdır.
entonio

Benim için çalıştı teşekkür ederim, benim özel durumda viewcontroller gömülü bir tableviewcontroller vardı ve otomatik olarak ayarlayarakAdjustsScrollViewInsets = viewcontroller yanlış false üst boşluk kayboldu
Alexey

39

Gruplandırılmış TableView kullanırken viewWillAppear'da kenar kesmeyi önlemek için bunu kullanın

self.tableView.contentInset = UIEdgeInsetsMake(-35, 0, 0, 0);

Diğerlerini denedim. Bu işe yaradı! Thx
Michael

36

Yukarıdaki yanıtların çoğu çok acayip. Apple bu beklenmedik davranışı düzeltmeye karar verirse gelecekte herhangi bir zamanda kırılacaklardı.

Sorunun kökü:

  1. a UITableView, 0,0 yüksekliğindeki bir başlığa sahip olmaktan hoşlanmaz. Yapmaya çalıştığınız şey, yüksekliği 0 olan bir başlık almaksa, çözüme atlayabilirsiniz.

  2. daha sonra başlığınıza 0,0 olmayan UITableViewbir yükseklik atasanız bile, ilk başta 0,0 yüksekliğinde bir başlık atanmasını sevmez.

Çözüm:

Ardından, en basit ve güvenilir düzeltme, tablo görünümünüze atadığınızda başlık yüksekliğinizin 0 olmadığından emin olmaktır.

Bunun gibi bir şey işe yarayacaktır:

// Replace UIView with whatever class you're using as your header below:
UIView *tableViewHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0.0, 0.0, self.tableView.bounds.size.width, CGFLOAT_MIN)];
self.tableView.tableHeaderView = tableViewHeaderView;

Böyle bir şey bir noktada soruna yol açacaktır (genellikle bir kaydırmadan sonra):

// Replace UIView with whatever class you're using as your header below:
UIView *tableViewHeaderView = [[UIView alloc] initWithFrame:CGRectZero];
self.tableView.tableHeaderView = tableViewHeaderView;

Sonunda, işe yarayan yanıtı buldum. Teşekkürler. Ayrıca, tableView.tableHeaderViewbunun aslında satır içeriğinin üzerinde aksesuar bir görünüm olduğunu öğrendim . Cevabınız ortaya çıkıncaya kadar bölüm başlıkları ile karıştırıldım.
Joe Huang

1
CGFLOAT_MIN, CGFloat.leastNormalMagnitudeSwift 3
Clay Ellis ile değiştirildi

29

Storyboard:

Yalnızca Adjust Scroll View InsetsDenetleyiciyi Görüntüle seçeneklerinde işaretini kaldırın

resim açıklamasını buraya girin

Kod:

self.automaticallyAdjustsScrollViewInsets = false

2
xcode 7 kullanarak Özellik denetçisi> Düzen'i göremiyorum, nereye self.automaticallyAdjustsScrollViewInsets = false ekleyebilirim
alex

görünümünde yük.
CW0007007

23

Swift 3 kullanan iOS 10 için çözüm budur:

Aşağıdaki yöntemleri uygulayarak üst ve alt dolgulardan kurtulabilirsiniz UITableViewDelegate.

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat
{ 
    return CGFloat.leastNormalMagnitude
}

func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat
{
   return CGFloat.leastNormalMagnitude
}

SO'daki ikinci sayfa bana yardımcı oldu ... Nedenini bilmiyorum, belki AutomaticDimension nedeniyle, belki VFL ile ilgili kısıtlamalar nedeniyle, neyse, teşekkür ederim! ozi bua ist brav! : D
Pentarex

Bunlar bölüm üstbilgileri ve altbilgileridir. Soru tüm tablo başlığı ile ilgilidir. Ayrıca, her iki delege yönteminde Swift3 veya iOS 10'a özgü bir şey yoktur (sonsuza kadar beri varlar).
Nicolas Miari

14

Benim durumumda bana yardımcı olan buydu. Ben de ios6'yı destekliyorum.

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
    self.edgesForExtendedLayout = UIRectEdgeNone;
    self.extendedLayoutIncludesOpaqueBars = NO;
    self.automaticallyAdjustsScrollViewInsets = NO;
}

Bunun ne yaptığından emin değilim ama mükemmel çalıştı. Biraz açıklama yapabilir misiniz?
Matt Wolfe

@MattWolfe Kayboldum ve bu çözümü buldum, bunun neden olduğundan emin değilim. Benim tahminim, denetleyici durum çubuğu (veya diğer durumlarda araç çubuğu / sekme çubuğu) nedeniyle tablo görüntüsünün bir iç metin gerektirdiğine karar vermesidir, böylece otomatik olarak ekler. Bazı yeni iOS7 "özellikleri" ile gerçekten mücadele ediyorum. Belki bazıları anlar ve bununla ilgili gerçek bir açıklaması vardır?
Lukas

IOS 7 nispeten küçük bir uygulama taşıma ve hala küçük sorunları olan son 2 gün geçirdim .. I ios 7 düzeltmek o 6 ve tam tersi .. Beni deli sürüş!
Matt Wolfe

Bu OP'den farklı bir sorundur. Bununla birlikte, gruplandırılmış tablo görünümü için, üste fazladan bir boşluk eklenir.
RajV

1
bu anahtar satır gibi görünüyor: self.automaticallyAdjustsScrollViewInsets = NO; sadece sahip olduğum ekstra alanı kaldırmış ayarı.
Mike M

14

VC'nizdeki viewDidLoad'a aşağıdakileri eklemeniz yeterlidir:

self.automaticallyAdjustsScrollViewInsets = NO;

Bu düzeltme çalıştı ve ben sihirli sayılar kullanarak iç metinleri elle ayarlamak için tercih ederim. Teşekkürler!
imobilizer

14

Bu yüzden burada her yöntemi deniyordum ve bu sefer hiçbiri yardımcı olmadı. Benim durumum, iOS 9'da gruplandırılmış bir tablo görünümüydi. Bunu neden ve nasıl bulduğumu gerçekten bilmiyorum, ama benim için, en az yükseklikte tableViewHeaderbir UIViewile çalışmak 0.01işe yaradı. CGRectZeroyardım etmedi, hiçbir şey gerçekten yardımcı olmadı:

tableView.tableHeaderView = UIView(frame: CGRect(x: 0.0, y: 0.0, width: 0.0, height: 0.01))

10

Swift: iOS Aynı ekranda "Geri" yi tıkladığımda kaydırma görünümünde tablo görünümü vardı. Kaydırma görünümü üstte daha fazla yer kaplıyor .. Bunu çözmek için kullandım:

 self.automaticallyAdjustsScrollViewInsets = false

Görünüm denetleyicisinin kaydırma görünümü eklerini otomatik olarak ayarlayıp ayarlamayacağını gösteren bir Boolean değeri. Varsayılan değer, görünüm denetleyicisinin durum çubuğu, gezinme çubuğu ve araç çubuğu veya sekme çubuğu tarafından tüketilen ekran alanlarına yanıt olarak kaydırma görünüm iç değerlerini ayarlamasına olanak tanıyan true değeridir. Görünüm hiyerarşisinde birden fazla kaydırma görünümü olduğu gibi, kaydırma görünümü ek ayarlamalarını kendiniz yönetmek istiyorsanız false olarak ayarlayın.


10

@Aurelien Porte'nin cevabı sayesinde. İşte benim çözümüm

Bu sorunun nedeni: -

  1. bir UITableView, yüksekliği 0.0 olan bir başlığa sahip olmaktan hoşlanmaz. Yapmaya çalıştığınız şey, yüksekliği 0 olan bir başlık almaksa, çözüme atlayabilirsiniz.
  2. daha sonra başlığınıza 0,0 olmayan bir yükseklik atasanız bile, bir UITableView'a ilk başta 0,0 yüksekliğinde bir başlık atanmak istemez.

ViewDidLoad içinde: -

self.edgesForExtendedLayout = UIRectEdge.None

self.automaticallyAdjustsScrollViewInsets = false

Böyle bir şeye gerek yok: -

self.myTableview.contentInset = UIEdgeInsetsMake(-56, 0, 0, 0)

In heightForHeaderInSectiondelege: -

if section == 0
    {
        return 1
    }
    else
    {
        return 40; // your other headers height value
    }

In viewForHeaderInSectiondelege: -

if section == 0 
{  
   // Note CGFloat.min for swift
   // For Objective-c CGFLOAT_MIN 
   let headerView = UIView.init(frame: CGRectMake(0.0, 0.0, self.myShaadiTableview.bounds.size.width, CGFloat.min)) 
   return headerView
}
else
{ 
   // Construct your other headers here 
}

10

İOS 11 ve Xcode 9.1'de kolayca bu şekilde düzeltilebilir.Storyboard ile :

Tablo Görünümü> Boyut Denetimi> İçerik Ekleri: Asla


1
Worked for me :)
bhupinder

Harika! Teşekkürler :)
Saeed Ir

1
Bu automaticallyAdjustsScrollViewInsetsios 11 yerine
Nik Kov

9

Bunun yeni UITableViewStyleGroupedstilin sadece bir parçası olduğunu varsayıyorum . Tüm gruplandırılmış tablo görünümlerinde ve bu alanı kontrol etmenin doğrudan bir yolu yok gibi görünüyor.

O alanı ile temsil ediliyorsa UIView, tüm arama yapmak mümkün olacaktır subviewsarasındaUITableView bu özel görünümü ve doğrudan düzenleme bulmak için. Bununla birlikte, alanın üstbilgiler ve hücreler başlamadan önce yalnızca sabit kodlu bir ofset olma olasılığı vardır ve onu düzenlemek için herhangi bir yol yoktur.

Tüm alt görünümler arasında arama yapmak için (tablonun hücresi olmadığında bu kodu çalıştırır, çıktıyı okumayı biraz daha kolay hale getirir):

- (void)listSubviewsOfView:(UIView *)view {

    // Get the subviews of the view
    NSArray *subviews = [view subviews];

    // Return if there are no subviews
    if ([subviews count] == 0) return;

    for (UIView *subview in subviews) {

        NSLog(@"%@", subview);

        // List the subviews of subview
        [self listSubviewsOfView:subview];
    }
}

3
UITableViewCellScrollViewİOS7'deki UITableViews (daha spesifik olmak gerekirse ) bize bir şey öğretmişse, yerleşik sınıfların görünüm hiyerarşisini tek başına bırakmaktır.
Matthias Bauch

İyi bir nokta. Diğer seçenek ... her iOS için hacklemeyi sürdürmek;)
Dan Rosenstark

Hata! Bu uyarıyı yazmak istedim ama unuttum.
Kevin

Kevin - Bence haklısın, bu tasarım gereğidir. HeightForHeaderInSection için 0 döndürmenin, bu dolguyu kaldırmanın en kolay yolu olduğu görülmektedir. Bu belirli bir nedenden ötürü benim için çalışmıyor, ancak diğer UITableView'larda çalışıyor.
esilver

1
Kesinlikle "tasarım gereği". Yürütmeyi duraklattıysanız ve çalıştırdıysanız: po [((UIApplication *)UIApplication.sharedApplication).keyWindow recursiveDescription]tablo üstbilgisinin veya ilk bölüm üstbilgisinin veya ilk hücrenin (kullandığınız şeye bağlı olarak) doğal olarak 35 piksellik bir kenarlık bıraktığını görürsünüz.
Bay T

9

Cevabım daha genel bir cevap olacak, ama buna da uygulanabilir.

Eğer kök görünümü (bir viewController ) ya da ilk çocuk (Subview) kök bakış UIScrollView (veya UIScrollView kendisi) ve eğer alt sınıfıdır

self.navigationController.navigationBar.translucent = YES;

framework otomatik olarak önceden hesaplanan contentInset ayarlar .


Bundan kaçınmak için

self.automaticallyAdjustsScrollViewInsets = NO;

ama benim durumumda bunu yapamadım, çünkü UIView bileşeni olan diğer geliştiriciler tarafından kullanılabilen SDK uyguluyordum. Bu UIView bileşeni UIWebView (ilk alt görünüm olarak UIScrollView olan) içerir. Bu bileşen UIViewController'ın görünüm hiyerarşisinde ilk alt öğe olarak eklenirse, otomatik ekler sistem tarafından uygulanır.

Bu UIWebView eklemeden önce çerçeve (0,0,0,0) ile kukla görünüm ekleyerek düzeltildi .

Bu durumda sistem, UIScrollView öğesinin alt sınıfını ilk alt görünüm olarak bulamadı ve ekler uygulamadı


hayat kurtarıcı! teşekkür ederimself.automaticallyAdjustsScrollViewInsets = false
ethanneff

8

Bu kod benim için çalıştı, benim tarafımdan yazılmış en iyi cevap, bu objective-Cyüzden Swift'e dönüştürdüm.

Swift 4.0+ için

self.tableView.tableHeaderView = UIView(frame: CGRect(x: 0, y: 0, width: self.tableView.bounds.size.width, height: 0.01))

Sadece içine yazın viewDidLoad()ve bir cazibe gibi çalışacaktır.


1
çok teşekkür ederim, benim için iyi çalıştı.
Angelo Polotto

1
hoş geldiniz mutlu kodlama
Vipul Kumar

7

Arielyz ile aynı düzeltmeyi yaptım. UITableView öğesini üst görünümün ilk alt görünümü olmayacak şekilde taşıdıktan sonra gitti. Benim alanım 20 pikseldi, 35 değil.

Bir portre xib'de yeniden oluşturamadım, sadece bir manzara xib. Basit bir demo uygulamasında yeniden oluşturabilirsem, daha sonra bir radar hatası vereceğim.


Aynı sorunla karşılaştı, contentInset'i değiştirerek çözemedi, ancak bu yöntem oldukça hacky olmasına rağmen çalıştı. Görsel hata ayıklama aracını kullanarak değer için, UITableView doğru yüksekliğe sahipken, içindeki UITableViewWrapper'ın olmadığını gördüm.
Mic Fok

Mükemmel. Bu, XCode 6.1'deki benim için hatayı düzeltti. Bu StackOverflow sayfasındaki diğer önerilerin hiçbiri fark yaratmadı. Bir UIView içinde bir UITableView vardı ve ilk alt görünüm oldu. 2. alt görünüm olmak için sürüklemek mükemmel bir şekilde düzeltildi. (Birinin bana ihtiyacı varsa, ben barda olacağım.)
Mike Gledhill

Teşekkür ederim! Bu, bir kap içinde bir tablo görünümü denetleyiciniz varsa da çalışır. Kapsayıcıyı üst görünümünün ilk görünümü olmayacak şekilde taşımak, tablo görünümünün üst kısmındaki boşluğu kaldırır.
strangeluck

7

Bence UIEdgeInsets -35 0 0 0 yapmak sıkıcı. Benim durumumda, tableView: heightForHeaderInSection: yöntemini uyguladım ve 0 döndürme potansiyeli var.

0'ı 0.1f olarak değiştirdiğimde, sorun ortadan kalktı.


1
Yapabilseydim, bunu bir kereden fazla vurguluyordum. Tuhaf bir otomatik sıralama hatası veya başka bir şey olmalı ... 0'dan fazla bir şey çalıştığından, 0.1 yerine FLT_EPSILON veya DBL_EPSILON kullanılmasını öneririm, her ikisi de 1.0 + epsilon! = 1.0
Henri Normak

7

Benim için işe yarayan tek şey:

Swift :

tableView.sectionHeaderHeight = 0
tableView.sectionFooterHeight = 0

Amaç-C :

self.tableView.sectionHeaderHeight = 0;
self.tableView.sectionFooterHeight = 0;

Ayrıca, ilk bölüm için hala fazladan alanım vardı. Çünkü tableHeaderViewözelliği yanlış kullanıyordum . Aşağıdakileri ekleyerek de düzeltildi:

self.tableView.tableHeaderView = UIView(frame: CGRect(x: 0, y: 0, width: tableView.frame.size.width, height: 0.01))

Swift 4.2 için benim için çalışıyor. Teşekkürler
Sylar

Üstbilgi görünümüne sahip iOS13 gruplandırılmış tablo görünümü için bu sayfadaki her şeyi denedim. self.tableView.tableHeaderView = UIView (çerçeve: CGRect (x: 0, y: 0, genişlik: tableView.frame.size.width, yükseklik: 0.01)). sorunu düzeltti.
Ning

7

Swift 4 kodu: Bölüm başlığı olmayan tablo görünümü için bu kodu ekleyebilirsiniz:

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return CGFloat.leastNormalMagnitude
}

ve başlık boşluğunu 0 olarak elde edersiniz.

Belirli bir yüksekliğinizin üstbilgisini istiyorsanız bu değeri iletin:

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return header_height
}

ve viewForHeaderinSection temsilcisinden görünüm.


Bu soruya cevap vermiyor. Soru, ondan nasıl kurtulacağınız değil, ekstra boşluğun nereden geldiği ile ilgiliydi.
Stephen Newell

garip şey, eğer heightforHeaderInsection u 0 döndürürseniz, hala bu ekstra alan olsun. CGFloat.leastNormalMagnitude (en az pozitif sayı) ile mükemmel çalışır
ShadeToD

7

Spesifik olarak, tableviewHeader alanını üstten kaldırmak için şu değişiklikleri yaptım:

YouStoryboard.storyboard> YouViewController> TableView> Boyut denetçisi> İçerik ekleri'ni seçin - Asla olarak ayarlamayın.

resim açıklamasını buraya girin


Bu yanıta kıyasla ekran görüntüsü dışındaki ek bilgiler nelerdir ?
Artjom B.14

sanırım aynı, bir çözüm ararken bu cevabı bulamadım. O zaman cevabımı silmeli miyim?
user832

Content insets = Neden bu sorunu gerçekten çözemediğini açıklayarak cevabınızı biraz genişletebiliyorsanız (bu seçenek nasıl çalışır?) Değil.
Artjom B.Red

İçerik ekleri hiçbir zaman olarak ayarlanmadığında, tableView textField düzenlemesinde yukarı kaydırılmaz.
mojtaba al moussawi

6

bunu kullan bence bu yardım ...

 - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
 {
    return 0.005f;// set this according to that you want...
 }

1
Parlak! İOS 9.2'de bir cazibe gibi çalışır. Bu cevap mükemmel çünkü bazı durumlarda ilk başlığı bastırmam gerekiyor, bazıları ise gösteriyor. Ben de işe CGFloat.min kullanarak başka bir cevap gördüm. Bu yüzden viewController artık 44.0 gibi bir gerçek sayı veya esasen 0 sağlayabilir.
David H

6
override func viewWillAppear(animated: Bool) {
        self.edgesForExtendedLayout = UIRectEdge.None

 //  OR

self.sampleTableView.contentInset = UIEdgeInsetsMake(-64, 0, 0, 0);

   //OR

 self.automaticallyAdjustsScrollViewInsets = false
        }

automaticAdjustsScrollViewInsets = benden yanlış iş! Teşekkür!
Daniel Kuta
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.