UITableView Bölüm Üstbilgileri için Yazı Tipi Boyutunu Değiştirme


139

Birisi bana UITableView bölüm başlığındaki metnin yazı tipi boyutunu değiştirmenin en kolay yolunu söyleyebilir mi?

Aşağıdaki başlıklar kullanılarak uygulanan bölüm başlıkları var:

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section

Sonra, bu yöntemi kullanarak bölüm üstbilgi yüksekliğini başarıyla değiştirmek anlıyorum:

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section

Bu yöntemi kullanarak doldurulmuş UITableView hücreleri var:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

Ancak, bölüm üstbilgisi metninin yazı tipi boyutunu - veya bu nedenle yazı tipi stilini - nasıl artıracağım konusunda takılıp kaldım?

Birisi lütfen yardım edebilir mi? Teşekkürler.


1
Hızlı sürüm
Juan Boero

Yanıtlar:


118

Ne yazık ki, bunu geçersiz kılmanız gerekebilir:

Hedef-C'de:

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section

Swift'te:

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView?

Bunun gibi bir şey deneyin:

Hedef-C'de:

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {

    UILabel *myLabel = [[UILabel alloc] init];
    myLabel.frame = CGRectMake(20, 8, 320, 20);
    myLabel.font = [UIFont boldSystemFontOfSize:18];
    myLabel.text = [self tableView:tableView titleForHeaderInSection:section];

    UIView *headerView = [[UIView alloc] init];
    [headerView addSubview:myLabel];

    return headerView;
}

Swift'te:

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {

    let myLabel = UILabel()
    myLabel.frame = CGRect(x: 20, y: 8, width: 320, height: 20)
    myLabel.font = UIFont.boldSystemFont(ofSize: 18)
    myLabel.text = self.tableView(tableView, titleForHeaderInSection: section)

    let headerView = UIView()
    headerView.addSubview(myLabel)

    return headerView
}

1
Teşekkür ederim. Bu mükemmel çalıştı. Çok takdir etmek.
JRD8

5
Bu doğru bir çözüm olsa da, bu yönteme dikkat edin. Bir satırdan daha uzun bir başlık için, başlığın tableView:heightForHeaderInSection:hantal olabileceği başlığın yüksekliği hesaplamalarını yapmanız gerekir .
Leo Natan

3
Bunu denedim ve tabloyu yukarı kaydırdığınızda çalışırken Başlık Etiketi ekranda kalır ve hücreleri kaplar. :(
Plazma

2
@trss Sanırım bunun beklenen bir davranış olmadığını göreceksiniz. Orada kalan başlık bölümünden bahsetmiyorum, sadece etiket ve onun altından geçerken hücrelere dayatılan gerçek bir karışıklık gibi görünüyor. Bunu başarmak için daha iyi bir yol buldum ve bir kez daha bulduğumda geri göndereceğim.
Plazma

1
@ mosca1337 başka bir görünüm oluşturmanıza gerek yoktur, gerçek 'UITableViewHeaderFooterView' görüntülenmesini sağlayabilir ve parametreleri ayarlayabilirsiniz.
Juan Boero

368

Bunu yapmanın başka bir yolu da UITableViewDelegateyönteme yanıt vermektir willDisplayHeaderView. Geçilen görünüm aslında a örneğidir UITableViewHeaderFooterView.

Aşağıdaki örnek yazı tipini değiştirir ve ayrıca başlık metnini hücre içinde dikey ve yatay olarak ortalar. Ayrıca heightForHeaderInSection, tablonuzun yüksekliğinde yapılan değişikliklerin tablo görünümünün düzeninde dikkate alınması için yanıt vermeniz gerektiğini unutmayın . (Yani, bu willDisplayHeaderViewyöntemde başlık yüksekliğini değiştirmeye karar verirseniz .)

Daha sonra titleForHeaderInSectionbu yapılandırılmış üstbilgiyi farklı bölüm başlıklarıyla yeniden kullanma yöntemine yanıt verebilirsiniz .

Objective-C

- (void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section {
    UITableViewHeaderFooterView *header = (UITableViewHeaderFooterView *)view;

    header.textLabel.textColor = [UIColor redColor];
    header.textLabel.font = [UIFont boldSystemFontOfSize:18];
    CGRect headerFrame = header.frame;
    header.textLabel.frame = headerFrame;
    header.textLabel.textAlignment = NSTextAlignmentCenter;
}

Hızlı 1.2

(Not: görünüm denetleyiciniz a'nın soyundan geliyorsa UITableViewController, bunun olarak bildirilmesi gerekir override func.)

override func tableView(tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) 
{
    let header:UITableViewHeaderFooterView = view as! UITableViewHeaderFooterView

    header.textLabel.textColor = UIColor.redColor()
    header.textLabel.font = UIFont.boldSystemFontOfSize(18)
    header.textLabel.frame = header.frame
    header.textLabel.textAlignment = NSTextAlignment.Center
}

Swift 3.0

Bu kod ayrıca, başlık görünümünüz UITableViewHeaderFooterView dışında bir şeyse uygulamanın çökmemesini sağlar:

override func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
    guard let header = view as? UITableViewHeaderFooterView else { return }
    header.textLabel?.textColor = UIColor.red
    header.textLabel?.font = UIFont.boldSystemFont(ofSize: 18)
    header.textLabel?.frame = header.frame
    header.textLabel?.textAlignment = .center
}

3
Bu yöntem benim için yukarıdaki yöntemden çok daha iyi çalıştı
Plazma

6
Gördüğüm en iyi cevap.
phatmann

2
Bu, alt sınıfa başka bir neden olmadığı varsayılarak (örneğin, görünüm ekleme gibi) bilgileri ayarlamanın "uygun" yolu olacaktır. Ayrıca, bu yöntem Dinamik Tür için başlık metnini güncellemek için kullanılabilir. Basitçe kullanın: header.textLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleHeadline];ve / veya header.detailTextLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleHeadline];gerekli diğer adımlarla birlikte (buraya bakın: captechconsulting.com/blog/john-szumski/… )
leanne

3
Bu başlık görünümünü yeniden boyutlandırmaz, bu nedenle yazı tipiniz Zapfino gibi büyük veya önemli ölçüde farklıysa (nedenini sorma) metni keser. Boyutu kendi başınıza hesaplamanız gerekiyorsa, bu bir karmaşa ve bunu yapmamalısınız.
Leo Natan

@CocoaPriest Beta sürümümde çökmüyor, tho. (GM tohum 2)
Patrick Bassut

96

Mosca1337'nin cevabı doğru bir çözüm olsa da, bu yönteme dikkat edin. Bir satırdan daha uzun metin içeren bir başlık için, başlığın tableView:heightForHeaderInSection:hantal olabileceği başlığın yüksekliği hesaplamalarını yapmanız gerekir .

Çok tercih edilen bir yöntem, görünüm API'sını kullanmaktır:

[[UILabel appearanceWhenContainedIn:[UITableViewHeaderFooterView class], nil] setFont:[UIFont boldSystemFontOfSize:28]];

Bu, yazı tipini değiştirirken, yüksekliklerin kendisini yönetmek için tablodan ayrılır.

En iyi sonuçlar için, tablo görünümünü alt sınıflara ayırın appearanceWhenContainedIn:ve fontun yalnızca belirli tablo görünümleri için değiştirildiğinden emin olmak için tutma zincirine (in ) ekleyin .


1
Alt sınıflama varsa, yine de özel bir görünüm - tableView:viewForHeaderInSection:sağdan döndürüyor musunuz? Bu durumda yazı tipi tam orada ayarlanabilir. @ Mosca1337'nin çözümü zaten bunu yapar.
trss

1
Haha, ben dün sonra bir woozeyim. Tablo görünümünü alt sınıflandırın ve kapsayıcı listesine ekleyin. ;-)
Leo Natan

2
Bu çözüm, gerçek altbilgi / başlık boyutunun hesaplanmasında birçok hataya neden olur. Özel yazı tipi ayarlanırken başlıklar kesildiğinde bazı örnekler gösterebilirim.
kas-kad

5
Swift 3 :UILabel.appearance(whenContainedInInstancesOf: [UITableViewHeaderFooterView.self]).font = UIFont.boldSystemFont(ofSize: 28)
Eric Hodgins

3
Bu, etiketi iOS 11'deki yazı tipine sığacak şekilde doğru şekilde yeniden boyutlandırmaz. Ayrıca, görünümleri yükledikten sonra yukarı ve aşağı kaydırmak bunları varsayılan yazı tipine sıfırlar.
nickdnk

25

İOS 7 için bunu kullanıyorum,


-(void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section
{
    UITableViewHeaderFooterView *header = (UITableViewHeaderFooterView *)view;

    header.textLabel.font = [UIFont boldSystemFontOfSize:10.0f];
    header.textLabel.textColor = [UIColor orangeColor];
}

İşte başlık yeniden boyutlandırma ile Swift 3.0 sürümü

override func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
    if let header = view as? UITableViewHeaderFooterView {
        header.textLabel!.font = UIFont.systemFont(ofSize: 24.0)
        header.textLabel!.textColor = UIColor.orange          
    }
}

6
Bu, başlık görünümünü yeni yazı tipine sığacak şekilde boyutlandırmaz.
Leo Natan

@LeoNatan Başlık görünümünü yeni yazı tipine uyacak şekilde nasıl boyutlandırabiliriz - bu yöntemde yapılabilir mi?
SAHM

Yukarıdaki cevabınızı gördüğümü açıklığa kavuşturmak istedim, ancak yalnızca kullanıcı tarafından seçilen bir yazı tipi (erişilebilirlik) belirli bir boyutu aştığında (yani, her zaman değil) yazı tipini değiştirmek istiyorum. Ben kontrol ve muhtemelen willDisplayHeaderView yazı tipini değiştirmek gerektiğine inanıyorum, bu yüzden yazı tipi değiştirilirse görünüm yüksekliğini yeniden hesaplamak bir yolu var mı?
SAHM

19

Hızlı 3:

Sadece boyutu ayarlamanın en basit yolu :

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

    let header = view as! UITableViewHeaderFooterView

    if let textlabel = header.textLabel {
        textlabel.font = textlabel.font.withSize(15)
    }
}

Aradığım en kolay yol bu.
Ryan

Hızlı 4'te çalışıyor! "Geçersiz kılma fonks .."
Matvey

8

Swift 2.0 :

  1. Varsayılan bölüm başlığını tamamen özelleştirilebilir UILabel ile değiştirin.

ViewForHeaderInSection uygulamasını şu şekilde uygulayın:

  override func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {

    let sectionTitle: String = self.tableView(tableView, titleForHeaderInSection: section)!
    if sectionTitle == "" {
      return nil
    }

    let title: UILabel = UILabel()

    title.text = sectionTitle
    title.textColor = UIColor(red: 0.0, green: 0.54, blue: 0.0, alpha: 0.8)
    title.backgroundColor = UIColor.clearColor()
    title.font = UIFont.boldSystemFontOfSize(15)

    return title
  }
  1. Varsayılan başlığı değiştirin (varsayılanı korur).

Aşağıdaki gibi willDisplayHeaderView uygulayın:

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

    if let view = view as? UITableViewHeaderFooterView {
      view.backgroundView?.backgroundColor = UIColor.blueColor()
      view.textLabel!.backgroundColor = UIColor.clearColor()
      view.textLabel!.textColor = UIColor.whiteColor()
      view.textLabel!.font = UIFont.boldSystemFontOfSize(15)
    }
  }

Unutmayın: Statik hücreler kullanıyorsanız, ilk bölüm üstbilgisi UITableView'ın üst kısmı nedeniyle diğer bölüm üstbilgilerinden daha fazla doldurulur; Bunu düzeltmek için:

HeightForHeaderInSection uygulamasını şu şekilde uygulayın:

  override func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {

    return 30.0 // Or whatever height you want!
  }

4

Swift 4 Leo Natan sürümü cevap olduğunu

UILabel.appearance(whenContainedInInstancesOf: [UITableViewHeaderFooterView.self]).font = UIFont.boldSystemFont(ofSize: 28)

Özel bir yazı tipi ayarlamak istiyorsanız,

if let font = UIFont(name: "font-name", size: 12) {
    UILabel.appearance(whenContainedInInstancesOf: [UITableViewHeaderFooterView.self]).font = font
}

Maalesef bu çerçeveyi yeniden boyutlandırmıyor.
nickdnk

3

Bu yöntemle yazı tipi boyutunu, yazı tipi stilini ve Başlık arka planını da ayarlayabilirsiniz . bunun için 2 yöntem var

İlk Yöntem

- (void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section{
        UITableViewHeaderFooterView *header = (UITableViewHeaderFooterView *)view;
        header.backgroundView.backgroundColor = [UIColor darkGrayColor];
        header.textLabel.font=[UIFont fontWithName:@"Open Sans-Regular" size:12];
        [header.textLabel setTextColor:[UIColor whiteColor]];
    }

İkinci Yöntem

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section{
    UILabel *myLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, tableView.frame.size.width, 30)];
//    myLabel.frame = CGRectMake(20, 8, 320, 20);
    myLabel.font = [UIFont fontWithName:@"Open Sans-Regular" size:12];
    myLabel.text = [NSString stringWithFormat:@"   %@",[self tableView:FilterSearchTable titleForHeaderInSection:section]];

    myLabel.backgroundColor=[UIColor blueColor];
    myLabel.textColor=[UIColor whiteColor];
    UIView *headerView = [[UIView alloc] init];
    [headerView addSubview:myLabel];
    return headerView;
}

1

Hızlı 2:

OP'nin istediği gibi, boyutu sistem kalın yazı tipi veya başka bir şey olarak değil , yalnızca ayarlayın:

func tableView(tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
        if let headerView = view as? UITableViewHeaderFooterView, textLabel = headerView.textLabel {

            let newSize = CGFloat(16)
            let fontName = textLabel.font.fontName
            textLabel.font = UIFont(name: fontName, size: newSize)
        }
    }

0

Bu, hızlı 5 ile benim çözümüm.

Üstbilgi bölümü görünümünü tam olarak denetlemek için, bir önceki gönderinin gösterdiği gibi denetleyicinizde tableView (: viewForHeaderInsection: :) yöntemini kullanmanız gerekir. Bununla birlikte, başka bir adım daha var: performansı artırmak için, elma her seferinde yeni bir görünüm oluşturmayı değil, tıpkı tablo hücresini yeniden kullanmak gibi başlık görünümünü yeniden kullanmanızı önerir. Bu, tableView.dequeueReusableHeaderFooterView (withIdentifier:) yöntemidir. Ancak bu yeniden kullanım işlevini kullanmaya başladığınızda, yazı tipi beklendiği gibi çalışmaz. Renk, hizalama gibi tüm şeyler sadece yazı tipi ama iyi. Bazı tartışmalar var ama ben aşağıdaki gibi çalışmasını sağladım.

Sorun tableView.dequeueReusableHeaderFooterView (withIdentifier :) her zaman bir hücre döndüren tableView.dequeneReuseCell (:) gibi değildir. Eski kimse yoksa sıfır döndürür. Yeniden kullanım üstbilgisi görünümü döndürse bile, orijinal sınıf türünüz değil, bir UITableHeaderFooterView. Bu yüzden yargılamayı yapmanız ve kendi kodunuza göre hareket etmeniz gerekir. Temel olarak, sıfırsa, yepyeni bir başlık görünümü elde edin. Sıfır değilse, kontrol edebilmeniz için döküm yapmaya zorlayın.

override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
        let reuse_header = tableView.dequeueReusableHeaderFooterView(withIdentifier: "yourHeaderID")
        if (reuse_header == nil) {
            let new_sec_header = YourTableHeaderViewClass(reuseIdentifier:"yourHeaderID")
            new_section_header.label.text="yourHeaderString"
            //do whatever to set color. alignment, etc to the label view property
            //note: the label property here should be your custom label view. Not the build-in labelView. This way you have total control.
            return new_section_header
        }
        else {
            let new_section_header = reuse_section_header as! yourTableHeaderViewClass
            new_sec_header.label.text="yourHeaderString"
            //do whatever color, alignment, etc to the label property
            return new_sec_header}

    }
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.