UITableViewHeaderFooterView:背景色を変更できません


124

UITableViewHeaderFooterViewの背景色を変更しようとしています。ビューは表示されていますが、背景色はデフォルトの色のままです。xcodeからログを取得しています:

UITableViewHeaderFooterViewの背景色の設定は廃止されました。代わりにcontentView.backgroundColorを使用してください。

ただし、次のオプションはどれも機能しません。

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

また、xibファイルのビューの背景色を変更してみました。

助言がありますか?ありがとう。


2
iOS 13では、contentView.backgroundColorを使用しました。私はAppleがこれを更新だと思う
TA Truhoada

回答:


94

myTableViewHeaderFooterView.tintColorを使用するか、myTableViewHeaderFooterView.backgroundViewにカスタム背景ビューを割り当てる必要があります。


2
myTableViewHeaderFooterView.tintColorは完全に機能します。答えてくれてありがとう!
Chun

15
理由はわかりませtintColorんが、私にとってはiOS7で作業していません。カスタムビューを割り当てることでのみ色を変更できます:myTableViewHeaderFooterView.backgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"myImage.png"]];
スカイワインダー'16年

7
TintColorは背景色ではありません!!
ジョアン・ヌネス

189

iOS 8、9、10、11 ...

任意の色(任意のアルファを持つ)を設定する唯一の方法は、以下を使用することbackgroundViewです。

迅速

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;
    });

コメントへの対応

  • これらの他のオプションはどれ確実に機能しません(以下のコメントにもかかわらず)

    // self.contentView.backgroundColor = [UIColor clearColor];
    // self.backgroundColor = [UIColor clearColor];
    // self.tintColor = [UIColor clearColor];
    
  • これbackgroundViewは自動的にサイズ変更されます。(制約を追加する必要はありません)

  • UIColor(white: 0.5, alpha: 0.5)またはでアルファを制御しbackgroundView.alpha = 0.5ます。
    (もちろん、どの色でもかまいません)

  • XIBを使用する場合は、ルートビューを作成しUITableViewHeaderFooterViewbackgroundViewプログラムで関連付けます。

    登録:

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

    ロード:

    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
    }
    

デモ

animationリプレイアニメーション

この上のソリューションの検索► GitHubの上やその他の詳細スウィフトのレシピを


5
contentViewが存在しないのはそのためです。tintcolorは、背景ではなくビューに色を付けることです。backgroundcolorは非推奨です。したがって、あなたの方法はそれを機能させる方法です。ところで素敵なコードの構文
ジョアン・ヌネス

@JoãoNunes、C#/ Xamarinを使用すると、構文がview.BackgroundView = new UIView(view.Bounds) { BackgroundColor = UIColor.Clear };
すっきりし

:Xcodeの6.1.1では、実行時のコンソール警告を取得Setting the background color on UITableViewHeaderFooterView has been deprecated. Please use contentView.backgroundColor instead.
アルバートBori

Xcode6.2 beta5でも、同じ警告が表示されました。UITableViewHeaderFooterViewの作成方法は、AppleサンプルコードTVAnimationsGesturesに似たxibのロードに基づいています。ただし、Xcode6.2b5を使用したTVAnimationGesturesは警告メッセージを生成しません。Appleコードには、「バックグラウンド」文字列がまったくありません。もちろん、uitableVuewHeaderFooterview.contentViewはTVAnimationsGesturesではnilです。なぜこれが起こるのか分かりません。
kmugitani 2015

7
それでも警告が表示される場合は、UITableViewHeaderFooterViewのIBでbackgroundColorが設定されていないことを確認してください。
Tuslareb、2016

24

iOS 7ではcontentView.backgroundColor機能しましたが、機能tintColorしませんでした。

   headerView.contentView.backgroundColor = [UIColor blackColor];

けれどもは、clearColor私が見つけた解決策を設定することで、私のために動作しませんでした backgroundView透明画像へのプロパティ。多分それは誰かを助けるでしょう:

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

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

これは@SwiftArchitectの答えよりも優れたアプローチだと思います(うまくいきましたが)。新しいUIViewを追加する必要がないという事実は、それをより良くします。私には完璧に働きました。
Erick A.Montañez2017年

14

のbackgroundColorを設定しcontentViewてくださいUITableViewHeaderFooterView

self.contentView.backgroundColor = [UIColor whiteColor];

その後、動作します。


iOS> = 10のみ!。iOS <10の場合:backgroundView?.backgroundColor = UIColor.white
Peter Kreinz

12

私は上記のすべてを試しましたが、「UITableViewHeaderFooterViewでの背景色の設定は非推奨になりました。代わりにcontentView.backgroundColorを使用してください」という警告が表示されました。それから私はこれを試しました:xibファイル内でヘッダービューの背景色がデフォルトではなくクリアカラーに選択されていたため、デフォルトに変更すると警告が消えました。 これでした

これに変更


7

クリアな色のために、私は使用します

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

元気そうです。


1
設定するbackgroundView = UIView()backgroundColor = .clear、唯一の実用的なソリューションでした。ありがとうございました。
2017年

7

単色の背景色の場合は、を設定するcontentView.backgroundColorだけで十分です。

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

色を含む透明.clear色の場合、これは機能しなくなります。

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

完全に透明なセクションヘッダーの場合、backgroundViewプロパティを空のビューに設定します。

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

ただし、起こりうる副作用に注意してください。テーブルビューが「グループ化」に設定されていない限り、セクションヘッダーは下にスクロールしたときに上部にスナップします。セクションヘッダーが透明の場合、セルのコンテンツが透けて見えるため、見栄えがよくない場合があります。

ここでは、セクションヘッダーの背景が透明になっています。

ここに画像の説明を入力してください

これを防ぐには、セクションヘッダーの背景を、テーブルビューまたはビューコントローラーの背景に一致する単色(またはグラデーション)に設定することをお勧めします。

ここで、セクションヘッダーは完全に不透明なグラデーションの背景になります。

ここに画像の説明を入力してください


天才!backgroundViewに空のUIViewを定義すると、問題が完全に解決しました!ありがとう!
Luiz Dias


4

iOS9 headerView.backgroundView.backgroundColor私のために働きました。

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

iOS8私が使っていたheaderView.contentView.backgroundColor問題もなく、今のiOS 9で、私は、セルの空間全体を埋めない背景色をした奇妙な問題を得ていました。だから私はちょうど試してみheaderView.backgroundColorましたが、OPから同じエラーが発生しました。

UITableViewHeaderFooterViewの背景色の設定は廃止されました。代わりにcontentView.backgroundColorを使用してください。

したがって、すべてがうまく機能し、警告なしで headerView.backgroundView.backgroundColor


4

UITableViewHeaderFooterViewwith xibファイルのカスタムサブクラスを作成した場合は、オーバーライドする必要がありますsetBackgroundColor。空のままにします。

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

}

そして、これはあなたの問題を解決します。


これは正解です。HeaderFooterViewで背景色を設定していませんが、コンソールログに警告メッセージが表示され続けます。とても迷惑!
stan liu 2017

4

あなたがいる場合はストーリーボード/ペン先を持つセクションのヘッダーセルをカスタマイズし、必ず背景色があることを確認デフォルト「テーブルセクションヘッダー」ビューのために。

そして、もしあなたがサブクラス化しUITableViewHeaderFooterView、そしてnibを使用しているなら、あなたがしなければならないことIBOutletは、コンテンツビューのためにを作成し、それに名前を付けることです。containerView。これはcontentView、このコンテナビューの親であると混同しないでください。

そのセットアップでは、containerView代わりにの背景色を変更します。


1

AppearanceWhenContainedInチェーンを試してみましたが、うまくいきました。

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

1

おそらくbackgroundViewが存在しないためです

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

それは私のために働きます。


1

iOS 12、Swift5。AppearanceProxyを使用する(またはしようとする)場合、次のソリューションが機能します。

  1. UITableViewHeaderFooterViewをサブクラス化し、独自の外観プロキシ設定を公開します。
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. 外観プロキシを必要な粒度で設定します。
MySectionHeaderView.appearance().forceBackgroundColor = .red

または

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

1

困難を忘れてください。

UITableViewHeaderFooterView+BGUpdate.swift以下のコードを使用してプロジェクトに追加します。

extension UITableViewHeaderFooterView {

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

以前のように、使い方は簡単です。

headerView.backgroundColor = .red

使用例

1)代理人の場合tableView:viewForHeaderInSection:

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

または

2)カスタムヘッダービュークラス:

class MyHeaderView: UITableViewHeaderFooterView {

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

わかりました...あなたの方法が優れています。:)ありがとう
Eli Burke

1
このソリューションは、iOS 12上の再帰ループが発生
Koppacetic

0

明確な色でBackgroundViewを設定すると、表示されるヘッダーに対して正常に機能します。テーブルをスクロールして下部にヘッダーを表示すると、このソリューションは失敗します。

PSMyテーブルは、セルのないヘッダーのみで構成されています。


0

迅速:

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を作成して背景色を設定し、それをself.backgroundViewに設定します。

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

0

私の経験を共有することを余儀なくされました。iOS 10とiOS 11で正常に動作するこのコードを使用しましたheaderView?.contentView.backgroundColor = .lightGray

次に、いくつかのデバイスがあるため、私は突然iOS 9にアプリを展開することに決めました(iPad miniの一部の古い世代は9を超えるOSに更新されません)-すべてのiOS 9、10、11で機能する唯一のソリューション他のすべてのヘッダーサブビューを含むヘッダーのベースビューを定義し、ストーリーボードから配線してbackgroundColor、そのベースビューのを設定しました。

アウトレットをそれを呼び出さないように配線するときは注意が必要です。backgroundViewその名前を持つプロパティがすでにsomeにあるためsuperclassです。私は私に電話しましたcontainingView

また、アウトレットコントロールを配線する場合は、ビューをクリックして、Document Outline配線されていないことを確認してください。file owner


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

これは質問に答えるかもしれませんが、レビューのフラグが付けられました。説明のない回答は低品質と見なされることがよくあります。これが正しい答えである理由について、答えにコメントを記入してください。
Dan
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.