web-dev-qa-db-ja.com

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

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

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

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

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

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

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

108
Chun

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

76
Matt

iOS 8、9、10、11 ...

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

Swift

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を使用する場合、ルートビューをUITableViewHeaderFooterViewにし、backgroundViewをプログラムで関連付けます。

    に登録:

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

    Load with:

    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
    }
    

Demo

↻アニメーションの再生

GitHub でこのソリューションを見つけ、 Swift Recipes で追加の詳細を見つけてください。

177
SwiftArchitect

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];
20
sash

contentViewUITableViewHeaderFooterViewのbackgroundColorを必ず設定してください。

self.contentView.backgroundColor = [UIColor whiteColor];

その後、動作します。

11
Rudolf J

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

Changed to this

10
AmJa

明確な色のために、私は

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

それは私にはいいようです。

5
ChildhoodAndy

enter image description here インターフェイスビルダーで、.xibの最上部の要素で、属性インスペクターで背景色をデフォルトに設定します。次に、コンテンツビューに移動して、背景色を設定します( https://github.com/jiecao-fm/SwiftTheme/issues/24 を参照)。

4
Hosny

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

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

}

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

4
Voloda2

オンiOS9headerView.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
Jan

Storyboard/Nibでセクションヘッダーセルをカスタマイズする の場合、「テーブルの背景色がdefaultであることを確認してください。セクションヘッダー」ビュー。

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

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

4
samwize

単色の背景色の場合、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!
    }
}

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

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

enter image description here

これを防ぐには、セクションヘッダーの背景を、Table ViewまたはView Controllerの背景と一致する単色(またはグラデーション)に設定することをお勧めします。

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

enter image description here

3
Eneko Alonso

アピアランスWhenContainedInチェーンで試してみたところ、うまくいきました。

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

たぶんbackgroundViewが存在しないため

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

それは私のために働く。

1
kidnapper

スイフト:

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

私は自分の経験を共有せざるを得ないと感じています。 iOS 10およびiOS 11で正常に動作するこのコードがありましたheaderView?.contentView.backgroundColor = .lightGray

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

アウトレットを呼び出さないようにアウトレットを配線するときは注意してください:backgroundViewには、その名前のプロパティが既にsuperclassにあるためです。私はcontainingViewと呼んだ

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

0
Ahmed Khedr

UIViewを作成して背景色を設定し、self.backgroundViewに設定します。

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

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

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

0
user3106871