UITableViewHeaderFooterView: Arka plan rengi değiştirilemiyor


124

UITableViewHeaderFooterView'ın arka plan rengini değiştirmeye çalışıyorum. Görünüm görünmesine rağmen, arka plan rengi varsayılan renk olarak kalır. Xcode'dan şunu söyleyen bir günlük alıyorum:

UITableViewHeaderFooterView'da arka plan renginin ayarlanması kullanımdan kaldırıldı. Lütfen bunun yerine contentView.backgroundColor kullanın.

Ancak, aşağıdaki seçeneklerin hiçbiri çalışmaz:

myTableViewHeaderFooterView.contentView.backgroundColor = [UIColor blackColor];
myTableViewHeaderFooterView.backgroundView.backgroundColor = [UIColor blackColor];
myTableViewHeaderFooterView.backgroundColor = [UIColor blackColor];

Ayrıca xib dosyasındaki görünümün arka plan rengini değiştirmeyi denedim.

Baska öneri? Teşekkürler.


2
iOS 13'te benim için çalışan contentView.backgroundColor kullanın. Sanırım Apple bunu güncelledi
Tà Truhoada

Yanıtlar:


95

MyTableViewHeaderFooterView.tintColor kullanmanız veya myTableViewHeaderFooterView.backgroundView öğesine özel bir arka plan görünümü atamanız gerekir.


2
myTableViewHeaderFooterView.tintColor mükemmel çalışıyor. Cevap için teşekkürler!
Chun

15
Nedenini bilmiyorum ama benim tintColoriçin iOS7'de çalışmıyorum. Rengi yalnızca özel görünüm atayarak değiştirebilirim:myTableViewHeaderFooterView.backgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"myImage.png"]];
skywinder

7
TintColor arka plan rengi değil !!
João Nunes

189

iOS 8, 9, 10, 11 ...

Herhangi bir rengi (herhangi bir alfa ile) ayarlamanın tek yolu kullanmaktır backgroundView :

hızlı

self.backgroundView = UIView(frame: self.bounds)
self.backgroundView.backgroundColor = UIColor(white: 0.5, alpha: 0.5)

Obj-Cı

self.backgroundView = ({
    UIView * view = [[UIView alloc] initWithFrame:self.bounds];
    view.backgroundColor = [UIColor colorWithWhite: 0.5 alpha:0.5];
    view;
    });

Yorumlara Verilen Yanıtlar

  • Bu diğer seçeneklerin hiçbiri güvenilir şekilde çalışmıyor (aşağıdaki yorumlara rağmen)

    // self.contentView.backgroundColor = [UIColor clearColor];
    // self.backgroundColor = [UIColor clearColor];
    // self.tintColor = [UIColor clearColor];
  • backgroundViewotomatik boyutlandırılır. (Kısıtlama eklemeye gerek yok)

  • Alfa'yı UIColor(white: 0.5, alpha: 0.5)veya ile kontrol edin backgroundView.alpha = 0.5.
    (tabii ki her renk işe yarar)

  • XIB kullanırken , kök görünümü a yapın UITableViewHeaderFooterViewvebackgroundView programlı olarak :

    Şununla kayıt olun:

    tableView.register(UINib(nibName: "View", bundle: nil),
                       forHeaderFooterViewReuseIdentifier: "header")

    Şununla yükle:

    override func tableView(_ tableView: UITableView,
                            viewForHeaderInSection section: Int) -> UIView? {
        if let header =
            tableView.dequeueReusableHeaderFooterView(withIdentifier: "header") {
            let backgroundView = UIView(frame: header.bounds)
            backgroundView.backgroundColor = UIColor(white: 0.5, alpha: 0.5)
            header.backgroundView = backgroundView
            return header
        }
        return nil
    }

gösteri

↻ animasyonu tekrar oynatma

GitHub'da bu çözümü ve Swift Tarifleriyle ilgili ek ayrıntıları bulun .


5
contentView yok, bu yüzden. renk tonu görünümü arka planı değil renklendirmektir. ve arka plan rengi kullanımdan kaldırılmıştır. Böylece sizin yolunuz, onu çalıştırmanın yoludur. BTW güzel kod sözdizimi
João Nunes

@ JoãoNunes, C # / Xamarin ile sözdizimi daha da düzgün:view.BackgroundView = new UIView(view.Bounds) { BackgroundColor = UIColor.Clear };
crishoj

Xcode 6.1.1'de, bir çalışma zamanı konsolu uyarısı alırsınız:Setting the background color on UITableViewHeaderFooterView has been deprecated. Please use contentView.backgroundColor instead.
Albert Bori

Xcode6.2 beta5 ile hala aynı uyarıyı alıyorum. UITableViewHeaderFooterView oluşturma yöntemim, Apple örnek koduna (TVAnimationsGestures) benzer olan xib'i yüklemeye dayanıyor. Ancak, Xcode6.2b5 ile TVAnimationGestures herhangi bir uyarı mesajı oluşturmaz. Apple kodunda "arka plan" dizesi yoktur. Elbette, uitableVuewHeaderFooterview.contentView, TVAnimationsGestures'da sıfırdır. Bunun neden olduğunu anlamıyorum.
kmugitani

7
Hala uyarıyı alan kişiler için: UITableViewHeaderFooterView'ın IB'de bir backgroundColor ayarına sahip olmadığından emin olun.
Tuslareb

24

İOS 7'de contentView.backgroundColorbenim için çalıştı, tintColorolmadı.

   headerView.contentView.backgroundColor = [UIColor blackColor];

Gerçi clearColorben buldum çözüm kümesi etmek, benim için işe yaramadı backgroundViewşeffaf görüntüye mülk. Belki birine yardımcı olur:

UIGraphicsBeginImageContextWithOptions(CGSizeMake(1, 1), NO, 0.0);
UIImage *blank = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

headerView.backgroundView = [[UIImageView alloc] initWithImage:blank];

Bunun @SwiftArchitect'in cevabından daha iyi bir yaklaşım olduğunu düşünüyorum (işe yarasa da). Yeni bir UIView eklemeniz gerekmediği gerçeği, bunu daha iyi hale getirir. Benim için mükemmel çalıştı.
Erick A. Montañez

14

Eğer backgroundColor set emin olun contentViewşunlara ait UITableViewHeaderFooterView:

self.contentView.backgroundColor = [UIColor whiteColor];

O zaman işe yarayacak.


Yalnızca iOS> = 10 !. İOS <10 için şunu kullanın: backgroundView? .BackgroundColor = UIColor.white
Peter Kreinz

12

Benim için yukarıda belirtilen her şeyi denedim ama yine de "UITableViewHeaderFooterView'da arka plan renginin ayarlanması kullanımdan kaldırıldı. Lütfen bunun yerine contentView.backgroundColor kullanın." Uyarısı alıyorum. sonra şunu denedim: xib dosyasında başlık görünümü için arka plan rengi, rengi varsayılana değiştirdiğimde rengi temizlemek için varsayılan yerine seçildi, uyarı ortadan kalktı. bu muydu

Buna değiştirildi


7

Net bir renk için kullanıyorum

self.contentView.backgroundColor = [UIColor clearColor];
self.backgroundView = [UIView new];
self.backgroundView.backgroundColor = [UIColor clearColor];

Bana güzel görünüyor.


1
Ayarlamak backgroundView = UIView()ve sonra backgroundColor = .cleartek çalışan çözüm oldu. Teşekkür ederim.
Vive

7

Düz arka plan renkleri için contentView.backgroundColorşu ayarı yeterli olmalıdır:

func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
    if let headerView = view as? UITableViewHeaderFooterView {
        headerView.contentView.backgroundColor = .red // Works!
    }
}

.clearRenk dahil saydam renkler için artık bu geçerli değildir:

func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
    if let headerView = view as? UITableViewHeaderFooterView {
        headerView.contentView.backgroundColor = .clear // Does not work 😞
    }
}

Tam şeffaf bir bölüm başlığı için backgroundViewözelliği boş bir görünüme ayarlayın:

func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
    if let headerView = view as? UITableViewHeaderFooterView {
        headerView.backgroundView = UIView() // Works!
    }
}

Ancak olası yan etkilere dikkat edin. Tablo görünümü "Gruplanmış" olarak ayarlanmadıkça, bölüm başlıkları aşağı kaydırılırken en üstte yer alacaktır. Bölüm başlıkları şeffafsa, hücre içeriği görünecektir ve bu harika görünmeyebilir.

Burada, bölüm başlıklarının arka planı şeffaftır:

görüntü açıklamasını buraya girin

Bunu önlemek için, bölüm başlığının arka planını, tablo görünümünüzün veya görünüm denetleyicinizin arka planıyla eşleşen düz bir renge (veya gradyan) ayarlamak daha iyidir.

Burada, bölüm başlıkları tamamen opak bir gradyan arka planına sahiptir:

görüntü açıklamasını buraya girin


Genius! BackgroundView için boş bir UIView tanımlamak sorunu benim için tamamen çözdü! Teşekkürler!
Luiz Dias


4

On iOS9 headerView.backgroundView.backgroundColor benim için çalıştı:

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section{
    TableViewHeader *headerView = (TableViewHeader *)[super tableView:tableView viewForHeaderInSection:section];
    headerView.backgroundView.backgroundColor = [UIColor redColor];
}

On iOS8 ben kullanıyordum headerView.contentView.backgroundColorsorunsuz ama şimdi iOS 9 ile ben hücrenin bütün boşluğu doldurmak değil arka plan rengini yapılan garip bir sorunu başlamıştı. Bu yüzden sadece denedim headerView.backgroundColorve OP'den aynı hatayı aldım.

UITableViewHeaderFooterView'da arka plan renginin ayarlanması kullanımdan kaldırıldı. Lütfen bunun yerine contentView.backgroundColor kullanın.

Artık her şey harika ve uyarı olmadan çalışıyor. headerView.backgroundView.backgroundColor


4

file UITableViewHeaderFooterViewile özel bir alt sınıf oluşturduysanız xib, geçersiz kılmalısınız setBackgroundColor. Boş tutun.

-(void)setBackgroundColor:(UIColor *)backgroundColor {

}

Ve bu probleminizi çözecektir.


Bu benim için doğru cevap. HeaderFooterView'da herhangi bir arka plan rengi ayarlamamış olsam da uyarı mesajı konsol günlüğümde görünmeye devam ediyor. Çok can sıkıcı!
stan liu

4

Eğer varsa Storyboard / uçlu bir bölüm başlığı hücresini özelleştirme , ardından emin arkaplan rengidir yapmak varsayılan "Tablo Bölüm Başlığı" görünümü için.

Ve alt sınıfa ayırırsanız UITableViewHeaderFooterViewve uç kullanırsanız, yapmanız gereken şey, IBOutletiçerik görünümü için bir tane oluşturmak ve buna örn. containerView. Bu karıştırılmamalıdırcontentView bu kapsayıcı görünümünün üst öğesi olan .

Bu kurulumla, containerViewbunun yerine arka plan rengini değiştirirsiniz .


1

GörünümüWhenContainedIn zinciri ile denedim ve benim için çalıştı.

[[UIView appearanceWhenContainedIn:[UITableViewHeaderFooterView class], [UITableView class], nil] 
         setBackgroundColor: [UIColor.grayColor]];

1

belki de backgroundView olmadığı için

override func draw(_ rect: CGRect){
    // Drawing code
    let view = UIView()
    view.frame = rect
    self.backgroundView = view
    self.backgroundView?.backgroundColor = UIColor.yourColorHere
}

bu benim için çalışıyor.


1

iOS 12, Swift 5. Bir görünüm proxy'si kullanmaya istekli iseniz (veya çalışıyorsanız!), aşağıdaki çözüm işe yarar:

  1. Alt sınıf UITableViewHeaderFooterGörüntüleyin ve kendi görünüm proxy ayarınızı gösterin.
final class MySectionHeaderView: UITableViewHeaderFooterView {
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }

    override init(reuseIdentifier: String?) {
        super.init(reuseIdentifier: reuseIdentifier)
    }

    @objc dynamic var forceBackgroundColor: UIColor? {
        get { return self.contentView.backgroundColor }
        set(color) {
            self.contentView.backgroundColor = color
            // if your color is not opaque, adjust backgroundView as well
            self.backgroundView?.backgroundColor = .clear
        }
    }
}
  1. Görünüm proxy'sini istediğiniz ayrıntı düzeyinde ayarlayın.
MySectionHeaderView.appearance().forceBackgroundColor = .red

veya

MySectionHeaderView.appearance(whenContainedInInstancesOf: [MyOtherClass.self]).forceBackgroundColor = .red

1

Zorlukları unutun.

UITableViewHeaderFooterView+BGUpdate.swiftAşağıdaki kodla projenize ekleyin :

extension UITableViewHeaderFooterView {

    open override var backgroundColor: UIColor? {
        get {
            return self.backgroundColor
        }
        set {
            let bgView = UIView()
            bgView.backgroundColor = newValue
            backgroundView = bgView
        }
    }
}

Kullanım , daha önce beklediğiniz gibi basittir:

headerView.backgroundColor = .red

Kullanım örnekleri :

1) Temsilcinin tableView:viewForHeaderInSection::

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    let headerView = tv.dequeueReusableHeaderFooterView(withIdentifier: "MyHeaderView")
    headerView.backgroundColor = .red // <- here
    return headerView
}

veya

2) Özel başlık görünümü sınıfınızda:

class MyHeaderView: UITableViewHeaderFooterView {

    override func awakeFromNib() {
        super.awakeFromNib()
        backgroundColor = .red // <- here
    }
}

Tamam ... senin yolun daha iyi. :) Teşekkürler
Eli Burke

1
Bu çözüm, iOS 12'de yinelemeli bir döngüye neden oluyor.
Koppacetic

0

Arka Plan Görünümü'nü net renkle ayarlamak, görünür başlıklar için iyi çalışır. Tablo, altta başlıkları gösterecek şekilde kaydırılırsa, bu çözüm başarısız olur.

PSMy tablosu yalnızca hücre içermeyen başlıklardan oluşur.


0

Swift:

func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView {
    var headerView: TableViewHeader = super.tableView(tableView, viewForHeaderInSection: section) as! TableViewHeader
    headerView.backgroundView.backgroundColor = UIColor.redColor()
}

0

UIView oluşturun ve arka plan rengini ayarlayın, ardından self.backgroundView olarak ayarlayın.

- (void)setupBackgroundColor:(UIColor *) color {
    UIView *bgView = [[UIView alloc] initWithFrame:self.bounds];
    bgView.backgroundColor = color;
    self.backgroundView = bgView;
}

0

Deneyimlerimi paylaşmak zorunda olduğumu hissediyorum. İOS 10 ve iOS 11 ile iyi çalışan bir kod parçasına sahiptimheaderView?.contentView.backgroundColor = .lightGray

Sonra birdenbire, bazı cihazlar olduğu için uygulamayı iOS 9 için dağıtmaya karar verdim (iPad mini bazı eski nesiller 9'un ötesinde herhangi bir işletim sistemine güncellemez) - Tüm iOS 9, 10 ve 11 için çalışan tek çözüm başlık için diğer tüm başlık alt görünümlerini içeren bir temel görünüm tanımlamak, bunu film şeridinden bağlamak ve backgroundColorbu temel görünümü ayarlamaktı .

Prizi onu aramamaya bağlarken dikkatli olmak isteyeceksiniz: backgroundViewçünkü bazılarında zaten bu isimde bir mülk var.superclass . Benimkini aradımcontainingView

Ayrıca çıkış kontrolünü kablolarken, kablolamadığından Document Outlineemin olmak için görünüme tıklayın.file owner


0
let bgView = UIView()
bgView.backgroundColor = UIColor.clear
backgroundView = bgView
backgroundColor = UIColor.clear
contentView.backgroundColor = UIColor.clear

Bu, soruyu yanıtlayabilir ancak incelenmek üzere işaretlenmiştir. Açıklaması olmayan cevaplar genellikle düşük kaliteli olarak kabul edilir. Lütfen bunun neden doğru cevap olduğuna dair cevaba biraz yorum ekleyin.
Dan
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.