UITableView'da yüzen başlıkları UITableViewStylePlain ile devre dışı bırakmak mümkün müdür?


177

UITableViewİçeriği 'sayfalar' düzenlemek için kullanıyorum . Tablo görüntüsünün başlıklarını belirli görüntüleri vb. Düzenlemek için kullanıyorum ve eğer yüzerlerse, ancak stil ayarlandığında yaptıkları gibi statik kaldıklarını tercih ederim UITableViewStyleGrouped.

Diğer kullanmak sonra UITableViewStyleGrouped, bunu yapmanın bir yolu var mı? Tüm hücrelerime bir kenar boşluğu eklediğinden ve hücrelerin her biri için arka plan görünümünün devre dışı bırakılmasını gerektirdiğinden gruplandırılmış kullanmaktan kaçınmak istiyorum. Düzenimin tam kontrolünü istiyorum. İdeal olarak onlar bir "UITableViewStyleBareBones" olurdu, ama dokümanlar bu seçeneği görmedim ...

Çok teşekkürler,



59
Tablo stilini kullan UITableViewStyleGrouped - kayan üstbilgileri devre dışı bırakmak isteyen ve tüm soruyu okumayan herkes için cevap budur (başıma geldi ...).
ortalama Joe

@Kasztan Bu harika çalışan sıfır hatlı bir çözümdür! Teşekkürler.
Lee Fastenau

Yanıtlar:


27

Üstbilgi satırlarınızı yapmak için özel bir hücre kullanarak bunu taklit edebilmelisiniz. Bunlar daha sonra tablo görünümündeki diğer herhangi bir hücre gibi kayar.

cellForRowAtIndexPathÜstbilgi satırı olduğunda doğru hücre türünü döndürmek için bazı mantık eklemeniz yeterlidir .

Muhtemelen bölümlerinizi kendiniz yönetmeniz gerekecek, yani her şey tek bir bölümde olmalı ve başlıkları taklit etmelisiniz. (Üstbilgi görünümü için gizli bir görünüm döndürmeyi de deneyebilirsiniz, ancak bunun işe yarayıp yaramayacağını bilmiyorum)


11
Evet ... yine de biraz hack gibi gözüküyor. Bu, Apple'ın bir parçası gibi bir gözetim gibi görünüyor, açıkça bunu yapmak için kod var, sadece bir bayrak ayarlayabilmemiz gerekiyor.
Tricky

2
Özel bir saldırı olmadan efekti elde etmenin doğru yolu için aşağıdaki cevabımı kontrol edin, her bölümün ilk hücresini bölüm başlığı olarak yönetin!
Sumit Anantwar

338

Bunu başarmanın muhtemelen daha kolay bir yolu:

Objective-C:

CGFloat dummyViewHeight = 40;
UIView *dummyView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.tableView.bounds.size.width, dummyViewHeight)];
self.tableView.tableHeaderView = dummyView;
self.tableView.contentInset = UIEdgeInsetsMake(-dummyViewHeight, 0, 0, 0);

Swift:

let dummyViewHeight = CGFloat(40)
self.tableView.tableHeaderView = UIView(frame: CGRect(x: 0, y: 0, width: self.tableView.bounds.size.width, height: dummyViewHeight))
self.tableView.contentInset = UIEdgeInsetsMake(-dummyViewHeight, 0, 0, 0)

Bölüm başlıkları artık tıpkı normal bir hücre gibi kaydırılacaktır.


5
Bu aylaklık bir cazibe gibi çalışır !! Tablo üstbilgisi görünüm üstbilgisinin bulunması, bölüm üstbilgilerinin yüzmesini engeller. Ve tablo için uygun içerik ekleri ile görünmez bir başlık hile yapar .. Çok teşekkür ederim! bu cevabın neden fazla ilgi görmediğini merak ediyorum
Shyam Bhat

4
Hala inanmıyorum! Hiçbir özel API, sınıflar kazma, hiçbir şey! Yaşları boyunca bu sorunla karşı karşıya ve tablo üstbilgileri normal kaydırma yapacak kaydırma görünümleri (tableview kaydırma devre dışı) üstüne tablo görünümleri ekliyorum. ama sadece son zamanlarda elma bu düzeltmek için herhangi bir yeni yöntemler sağladığında aramaya başladı .. öylesine mutlu ben cevap tökezledi. tekrar teşekkürler
Shyam Bhat

13
gördüğüm tek dezavantaj, üst başlığın artık gösterilmeyeceğidir (yalnızca yukarı kaydırarak görebilirsiniz). En azından benim için gösterilmiyor
Ruzard

5
Yine de, tablonun tableHeaderView öğesini, üst kısmındaki yüksekliğini, bölüm üstbilgisinin yüksekliğine eşit bir sayı kadar artırarak ve içerik girintisini aynı sayıda azaltarak gösterebilirsiniz.
Shyam Bhat

2
Keşke bunu tekrar değerlendirebilseydim, bunun en azından bu soruya üçüncü kez katıldığımdan eminim ve bu sorunumu çözdü.
Ell Neal

252

(Yanlış tablo stili nedeniyle buraya gelmiş olanlar için) Tablo stilini düzden gruba, nitelik denetçisi veya kod aracılığıyla değiştirin:

let tableView = UITableView(frame: .zero, style: .grouped)

3
Tam da aradığım şey buydu. Teşekkürler!
ninjudd

4
"Diğer sonra UITableViewStyleGrouped kullanarak, bunu yapmanın bir yolu var mı?"
Michael Peterson

27
İyi bir şey ben en upvoted birini uygulamadan önce tüm cevapları kontrol etmeyi öğrendim :)
Tung Fam

1
Şimdi bu adamlar, aradığınız cevap. TableView StyleÖzelliği AttributesInspector'da da bulabileceğinizi unutmayın .
Cristian Holdunu

4
Soru özellikle "Diğer sonra UITableViewStyleGrouped kullanarak" bir yol aramak için bahseder
Ferdz

73

UYARI : Bu çözüm, ayrılmış bir API yöntemi uygular. Bu, uygulamanın AppStore'da dağıtım için Apple tarafından onaylanmasını engelleyebilir.

Bölüm başlıklarında yüzen özel yöntemleri açıkladım Blogumda

Temel olarak, sadece sınıflandırma UITableViewve NOyöntemlerinden ikisine geri dönmeniz gerekir :

- (BOOL)allowsHeaderViewsToFloat;
- (BOOL)allowsFooterViewsToFloat;

40
Bir yanıt, yalnızca özel API'lara atıfta bulunduğu için bir aşağı oyu hak etmiyor (herkes AppStore'a gönderilecek kod yazmıyor). Bu sorunun cevabı doğru olduğunda iki kat doğrudur. Bu yöntemler için NO döndüren alt sınıflandırma (veya daha kolay bir şekilde UITableView kategorisi oluşturma) başlıkların yüzmesini durdurur. : Bu genel bir API olarak eklenmiş görmek isterseniz, hata raporu lütfen bugreport.apple.com
jemmons

5
Bu işlevi bir Uygulamada uygularsak, Apple özel bir API kullandığınızı nasıl anlardı? Bildikleri kadarıyla, sadece bir alt sınıf UITableView içinde bir yöntem uyguladım ve kod çözmeden bile göremiyorlar ve bu o kadar kolay olmazdı. Bu özel bir API bir yöntem ARAMA değil, bu sadece .... birini uygulayan oluyor
Javier Soto

3
@jemmons Cevabınızı aşağıdan düşürmemi istemiyorsanız "özel API burada kullanılır" olarak işaretleyin. Bir tür sorumluluk reddi :)
kas-kad

2
"Blogum" bağlantınız koptu
MartinMoizard

12
@jemmons "Herkes AppStore'a gönderilecek kod yazmıyor" Appstore gerçekten sorun değil. Sorun, apple'ın özel API'leri iletişim kurmadan veya uygulamanızı bozacak şekilde kullanımdan kaldırmadan değiştirebilmesidir. Bu, özel API'leri neden Apple tarafından reddedilmekten daha iyi kullanmamanız gerektiğinin daha iyi bir nedeni
aryaxt

29

Tamam, geç olduğunu biliyorum ama yapmak zorundaydım. Şimdi çalışan bir çözüm arayarak 10 saat geçirdim, ancak tam bir cevap bulamadım. Bazı ipuçları buldum ama yeni başlayanlar için anlamak zor. Bu yüzden benim 2 sent koymak ve cevabı tamamlamak zorunda kaldı.

Cevapların birkaçında önerildiği gibi, uygulayabildiğim tek çalışma çözümü, tablo görünümüne normal hücreler ekleyip bunları Bölüm Başlıkları olarak ele almaktır, ancak bunu elde etmenin en iyi yolu, bu hücreleri her bölümün 0 satırı. Bu şekilde, bu özel kayan reklam başlıklarını kolayca halledebiliriz.

Yani, adımlar.

  1. UITableView, UITableViewStylePlain stiliyle uygulanır.

    -(void) loadView
    {
        [super loadView];
    
        UITableView *tblView =[[UITableView alloc] initWithFrame:CGRectMake(0, frame.origin.y, frame.size.width, frame.size.height-44-61-frame.origin.y) style:UITableViewStylePlain];
        tblView.delegate=self;
        tblView.dataSource=self;
        tblView.tag=2;
        tblView.backgroundColor=[UIColor clearColor];
        tblView.separatorStyle = UITableViewCellSeparatorStyleNone;
    }
  2. Her zamanki gibi titleForHeaderInSection uygulayın (bu değeri kendi mantığınızı kullanarak alabilirsiniz, ancak standart delegeleri kullanmayı tercih ediyorum).

    - (NSString *)tableView: (UITableView *)tableView titleForHeaderInSection:(NSInteger)section
    {
        NSString *headerTitle = [sectionArray objectAtIndex:section];
        return headerTitle;
    }
  3. Her zamanki gibi numarayı değiştirin

    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
    {
        int sectionCount = [sectionArray count];
        return sectionCount;
    }
  4. NumberOfRowsInSection öğesini her zamanki gibi uygulayın.

    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
    {
        int rowCount = [[cellArray objectAtIndex:section] count];
        return rowCount +1; //+1 for the extra row which we will fake for the Section Header
    }
  5. HeightForHeaderInSection için 0.0f döndür.

    - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
    {
        return 0.0f;
    }
  6. ViewForHeaderInSection uygulamayın. Nil döndürmek yerine yöntemi tamamen kaldırın.

  7. HeightForRowAtIndexPath içinde. (İndexpath.row == 0) olup olmadığını kontrol edin ve bölüm üstbilgisi için istenen hücre yüksekliğini döndürün, aksi takdirde hücrenin yüksekliğini döndürün.

    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        if(indexPath.row == 0)
        {
            return 80; //Height for the section header
        }
        else
        {
            return 70; //Height for the normal cell
        }
    }
  8. Şimdi cellForRowAtIndexPath'de (indexpath.row == 0) olup olmadığını kontrol edin ve hücreyi bölüm başlığının olmasını istediğiniz gibi uygulayın ve seçim stilini none olarak ayarlayın. ELSE, normal hücrenin olmasını istediğiniz gibi hücreyi uygular.

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        if (indexPath.row == 0)
        {
            UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"SectionCell"];
            if (cell == nil)
            {
                cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"SectionCell"] autorelease];
                cell.selectionStyle = UITableViewCellSelectionStyleNone; //So that the section header does not appear selected
    
                cell.backgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"SectionHeaderBackground"]];
            }
    
            cell.textLabel.text = [tableView.dataSource tableView:tableView titleForHeaderInSection:indexPath.section];
    
            return cell;
        }
        else
        {
            UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];
    
            if (cell == nil) 
            {
                cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Cell"] autorelease];
                cell.selectionStyle = UITableViewCellSelectionStyleGray; //So that the normal cell looks selected
    
                cell.backgroundView =[[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"CellBackground"]]autorelease];
                cell.selectedBackgroundView=[[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"SelectedCellBackground"]] autorelease];
            }
    
            cell.textLabel.text = [[cellArray objectAtIndex:indexPath.section] objectAtIndex:indexPath.row -1]; //row -1 to compensate for the extra header row
    
            return cell;
        }
    }
  9. Şimdi willSelectRowAtIndexPath'i uygulayın ve indexpath.row == 0 ise nil döndürün.

    - (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath
    {
        if (indexPath.row == 0)
        {
            return nil;
        }
    
        return indexPath;
    }
  10. Ve son olarak didSelectRowAtIndexPath'de (indexpath.row! = 0) olup olmadığını kontrol edin ve devam edin.

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    {
        if (indexPath.row != 0)
        {
            int row = indexPath.row -1; //Now use 'row' in place of indexPath.row
    
            //Do what ever you want the selection to perform
        }
    }

Bununla işiniz bitti. Artık mükemmel bir şekilde kayan, kayan bölüm başlığınız var.


1
Bölüm üstbilgisi satırını seçerken denetimin asla 'didSelectRowAtIndexPath' e ulaşmaması için 'willSelectRowAtIndexPath' uygulandı.
Sumit Anantwar

Aslında, başlık seçildiğinde satırları katlarım + açarım. Ama bunu yapabileceğinizi bilmek güzel
Yariv Nissim

Harika cevap, ama neden 'if (indexPath.row! = 0)' check-in 'didSelectRowAtIndexPath'? Ekstra güvenli olmak mı? 'WillSelectRowAtIndexPath' uygulamanızla satır hiçbir zaman 0 olamaz, değil mi?
Glenn85

1
@ Glenn85, geç cevap verdiğim için üzgünüm. Evet, sadece ekstra bir güvenlik içindir.
Sumit Anantwar

28

Arayüz Oluşturucunuzda probleminizi tıklayın Tablo Görünümü

problem tablosu görünümü

Ardından, Özellik Denetçisi'ne gidin ve Stil Düzünü Gruplanmış olarak değiştirin;) Kolay

kolay


17

UITableViewStyleGrouped ile ilgili ilginç olan şey, tableView'ın stili TableView'a değil hücrelere eklemesidir.

Stil, hücrenin bölümdeki konumuna göre farklı bir arka plan çizimini işleyen UIGroupTableViewCellBackground adlı bir sınıf olarak hücrelere backgroundView olarak eklenir.

Bu yüzden UITableViewStyleGrouped kullanmak, tablonun backgroundColor değerini clearColor olarak ayarlamak ve cellForRow'daki hücrenin backgroundView değerini değiştirmek çok basit bir çözüm olacaktır:

cell.backgroundView = [[[UIView alloc] initWithFrame:cell.bounds] autorelease];

1
Bu en iyi cevap olmalı. Burada bir blog yazısı var: corecocoa.wordpress.com/2011/09/17/…
Sam

Bu çözüm gerçekten işe yaramıyor. Etraftaki hücrelerde fazladan boşluk bırakıyorum. Herhangi bir fikir ?
gsempe

2
Hücrelerin contentView öğesi hala sağa kaydırılmaz mı?
Piotr Tomasik

15

TableView Stilinizi değiştirin:

self.tableview = [[UITableView alloc] initwithFrame:frame style:UITableViewStyleGrouped];

UITableView için apple belgelerine göre:

UITableViewStylePlain- Düz tablo görünümü. Tüm bölüm üstbilgileri veya altbilgileri satır içi ayırıcılar olarak görüntülenir ve tablo görünümü kaydırıldığında yüzer.

UITableViewStyleGrouped- Bölümleri ayrı satır grupları sunan tablo görünümü. Bölüm üstbilgileri ve altbilgileri yüzmez.


5

Başka bir zor yol var. Ana fikir, bölüm numarasını ikiye katlamaktır ve ilki yalnızca headerView öğesini, ikincisi ise gerçek hücreleri gösterir.

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return sectionCount * 2;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    if (section%2 == 0) {
        return 0;
    }
    return _rowCount;
}

O zaman yapmanız gereken headerInSection delegelerini uygulamaktır:

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
    if (section%2 == 0) {
        //return headerview;
    }
    return nil;
}

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
    if (section%2 == 0) {
        //return headerheight;
    }
    return 0;
}

Bu yaklaşımın veri kaynaklarınız üzerinde de çok az etkisi vardır:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    int real_section = (int)indexPath.section / 2;
    //your code
}

Diğer yaklaşımlarla karşılaştırıldığında, çerçeveyi veya içeriği değiştirmezken bu şekilde güvenlidir. Umarım bu yardımcı olabilir.


5

İstediğinizi almanın en kolay yolu, tablo stilinizi UITableViewStyleGroupedayırıcı stilini şu şekilde ayarlamaktır UITableViewCellSeparatorStyleNone:

- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
    return CGFLOAT_MIN; // return 0.01f; would work same 
}

- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section {
    return [[UIView alloc] initWithFrame:CGRectZero];
}

nilİstediğinizi elde etmenizden sonra altbilgi görünümünü geri döndürmeyi denemeyin , başlık yüksekliğini ve başlık görünümünü ayarlamayı unutmayın.


4

Bu sorununuzu çözmese de, benzer bir şey yapmak istediğimde benim için yaptı. Üstbilgiyi ayarlamak yerine yukarıdaki bölümün altbilgisini kullandım. Beni kurtaran şey, bu bölümün doğada küçük ve statik olmasıydı, bu yüzden asla görüşün alt kısmının altına doğru kaymadı.


İyi fikir. Bu hack'i seviyorum.
Steve Moser

komik gibi. fikri takdir ediyorum, ama bir hack bir hack'tir. başlıklar altta
yüzmeye

4

Swift 3+ için

UITableViewStyleGroupedAşağıdakileri kullanarak altbilginin yüksekliğini sıfıra ayarlamanız yeterlidir :

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

1
Bunun yerine 0 döndürebilirsiniz .leastNormalMagnitude. Ayrıca uygulamanız gerekiyortableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView?
Ilias Karim

@IliasKarim 0 olarak ayarlandığında sıfırdan farklı bir yüksekliğe sahip olur. Ayrıca, viewForFooterInSectionbu durumda işlevi uygulamak gerekli değildir .
Tamás Sengel

0ve .leastNormalMagnitudeaynı etkiye sahipti. Uygulama viewForFooterSectionyöntemi gerekmektedir. Nil'e dönmelisin. Bu Swift 5.1'de Xcode 11.3.1 ile.
Ilias Karim

3

Bu soruna nasıl yaklaşacağımı düşünürken, UITableViewStyleGrouped hakkında çok önemli bir ayrıntıyı hatırladım. UITableView'un gruplandırılmış stili (hücrelerin etrafındaki yuvarlak kenarlıklar) uygulama şekli, UITableView'a değil UITableViewCells'e özel bir backgroundView eklemektir. Her hücreye bir backgroundView eklenir (üst sıralar bölüm sınırının üst kısmını alır, orta olanlar yan sınırı alır ve alt kısım - iyi, alt kısım alır). Yani, sadece düz bir stil istiyorsak ve hücrelerimiz için özel bir backgroundView'ımız yoksa (bu, zamanların% 90'ında durumdur), tek yapmamız gereken UITableViewStyleGrouped kullanmak ve özel arka planı kaldırmaktır . Bu, şu iki adımı izleyerek yapılabilir:

TableView stilimizi UITableViewStyleGrouped olarak değiştirin Hücreyi döndürmeden hemen önce aşağıdaki satırı cellForRow öğesine ekleyin:

cell.backgroundView = [[[UIView ayırma] initWithFrame: cell.bounds] otomatik çalıştırma];

Ve bu kadar. TableView stili, kayan üstbilgiler dışında tam olarak UITableViewStylePlain gibi olur.

Bu yardımcı olur umarım!


2

Belki scrollViewDidScrolltablo üzerinde kullanabilirsiniz vecontentInset ve mevcut görünür üstbilgiye göre .

Kullanım durumum için işe yarıyor gibi görünüyor!

extension ViewController : UIScrollViewDelegate{

    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        guard   let tableView = scrollView as? UITableView,
            let visible = tableView.indexPathsForVisibleRows,
            let first = visible.first else {
            return
        }

        let headerHeight = tableView.rectForHeader(inSection: first.section).size.height
        let offset =  max(min(0, -tableView.contentOffset.y), -headerHeight)
        self.tableView.contentInset = UIEdgeInsetsMake(offset, 0, -offset, 0)
   }
}

1

Bunu yapmanın başka bir yolu da, üstbilgiyi istediğiniz bölümden hemen önce boş bir bölüm yapmak ve üstbilginizi bu bölüme koymaktır. Bölüm boş olduğundan başlık hemen kaydırılır.


1

Yukarıda bir Bölüm (sıfır satır ile) ekleyebilir, ardından yukarıdaki sectionFooterView öğesini geçerli bölümün headerView öğesi olarak ayarlayabilirsiniz, footerView kayar. Umarım yardım eder.


FooterViews, tıpkı HeaderViews gibi yüzer. Sadece ekranın altında yüzüyorlar, üstte değil.
Mark A. Donohoe

0

XAK'ı yoksay. Uygulamanızın elma tarafından kabul edilme şansına sahip olmasını istiyorsanız herhangi bir özel yöntemi keşfetmeyin.

Arayüz Oluşturucu kullanıyorsanız bu en kolayıdır. Görünümün üst kısmına (görüntülerin nereye gideceği) bir UIView ekler ve ardından tablo görünümünüzü bunun altına eklersiniz. IB buna göre boyutlandırmalıdır; yani, tablo görünümünün üst kısmı az önce eklediğiniz UIView'in altına dokunur ve yüksekliği ekranın geri kalanını kapsar.

Buradaki düşünce, bu UIView aslında tablo görünümünün bir parçası değilse, tablo görünümü ile kaydırma yapmayacağıdır. yani tablo görünümü başlığını yoksay.

Arayüz oluşturucu kullanmıyorsanız, biraz daha karmaşıktır, çünkü tablo görünümü için konumlandırmayı ve yüksekliği doğru almanız gerekir.


Bu soruya cevap vermiyor. Tricky, önermiş olduğunuz şey olan tablo üstbilgisi görünümüne değil, hücreler arasında oturan görünümler olan titleHeaderView'lere atıfta bulunuyor.
Daniel Wood


0

Kayan bölüm başlığı bölümlerini tamamen kaldırmak için şunları yapabilirsiniz:

- (UIView *) tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
    return [[UIView alloc] init];
}

return nil çalışmıyor.

Kayan ancak yine de bölüm üstbilgilerini göstermek için kendi davranışlarıyla özel bir görünüm sağlayabilirsiniz.


0

@ Samvermette'nin çözümünde bir varyasyon:

/// Allows for disabling scrolling headers in plain-styled tableviews
extension UITableView {

    static let shouldScrollSectionHeadersDummyViewHeight = CGFloat(40)

    var shouldScrollSectionHeaders: Bool {
        set {
            if newValue {
                tableHeaderView = UIView(frame: CGRect(x: 0, y: 0, width: bounds.size.width, height: UITableView.shouldScrollSectionHeadersDummyViewHeight))
                contentInset = UIEdgeInsets(top: -UITableView.shouldScrollSectionHeadersDummyViewHeight, left: 0, bottom: 0, right: 0)
            } else {
                tableHeaderView = nil
                contentInset = .zero
            }
        }

        get {
            return tableHeaderView != nil && contentInset.top == UITableView.shouldScrollSectionHeadersDummyViewHeight
        }
    }

}

0

Parçacık yalnızca ilk bölüm için yapışkan bir başlık görüntüler. Diğerleri bölüm başlıkları bir hücre ile yüzer.

func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {

    if section == 1 {
        tableView.contentInset = .zero
    }

}

func tableView(_ tableView: UITableView, didEndDisplayingHeaderView view: UIView, forSection section: Int) {
    if section == 0 {
        tableView.contentInset = .init(top: -tableView.sectionHeaderHeight, left: 0, bottom: 0, right: 0)
    }
}

-1

Bu, temsilcinin viewForHeaderInSection ve heightForHeaderInSection yerine üstbilgi görünümünü UITableViewController'ın viewDidLoad yönteminde el ile atayarak gerçekleştirilebilir. Örneğin, UITableViewController alt sınıfınızda, böyle bir şey yapabilirsiniz:

- (void)viewDidLoad {
    [super viewDidLoad];

    UILabel *headerView = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 0, 40)];
    [headerView setBackgroundColor:[UIColor magentaColor]];
    [headerView setTextAlignment:NSTextAlignmentCenter];
    [headerView setText:@"Hello World"];
    [[self tableView] setTableHeaderView:headerView];
}

Üstbilgi görünümü, kullanıcı kaydırdığında kaybolacaktır. Bunun neden böyle çalıştığını bilmiyorum, ama yapmak istediğiniz şeyi başarıyor gibi görünüyor.


Bu bir bölüm için değil, üstteki 1 başlık içindir.
makdad

-1

Belki de başlık görünümü arka planını şeffaf hale getirebilirsiniz:

- (void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section {
    view.tintColor = [UIColor clearColor];
}

Veya global olarak uygulayın:

    [UITableViewHeaderFooterView appearance].tintColor = [UIColor clearColor];

-2

Otomatik yerleşim olmadan ve XIB aracılığıyla yapılan her şeyle kullanılmak üzere başka bir daha basit çözümüm var:

1 / Başlığınızı doğrudan tablo görünümüne sürükleyip bırakarak tablo görünümüne yerleştirin.

2 / Yeni yapılan üstbilginin Boyut Denetçisinde, otomatik boyutlandırmayı değiştirin: yalnızca üst, sol ve sağ bağlantı noktalarını ve dolguyu yatay olarak bırakmanız gerekir.

Başlık için bu şekilde ayarlanmalıdır

Hile yapmalı!


-2

@ Samvermette'nin cevabına göre co Kodlayıcıların hızlı kullanımını kolaylaştırmak için Swift'te yukarıdaki kodu uyguladım.

let dummyViewHeight = CGFloat(40)
self.tableView.tableHeaderView = UIView(frame: CGRect(x: 0, y: 0, width: self.tableView.bounds.size.width, height: dummyViewHeight))
self.tableView.contentInset = UIEdgeInsetsMake(-dummyViewHeight, 0, 0, 0)

-2

ref: https://stackoverflow.com/a/26306212

let tableView = UITableView(frame: .zero, style: .grouped)

pluse

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    if section == 0 {
        return 40
    }else{
        tableView.sectionHeaderHeight = 0
    }

    return 0
}

Bu başlık alanının kullanılmasına yardımcı oldu


Lütfen, bunu yapma🙏
MQoder

-3

2020 Son Güncelleme

Xcode 14 ile test edilmiştir.

Herhangi bir bölüm başlığını gizlemek için, bölüm delegesi başlığı için Return nil

func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
    return nil
}

-4

bunu tableview delegate sınıfında viewForHeaderInSection yöntemini uygulayarak kolayca başarabilirsiniz. bu yöntem, bir UIView'in dönüş nesnesi olmasını bekler (başlık görünümünüzdür). kodumda aynı şeyi yaptım


Orijinal poster özel bir başlık istemiyor. Tablonun üstünde "yüzmeyen" bir başlık istiyorlar. Önerin hala yüzüyor.
jemmons

tablo görünümünü viewforheader ile UITableViewStyleGrouped olarak değiştirin, o zaman onu durduracak
mskw
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.