UITableViewCellは白い背景を表示し、iOS7では変更できません


186

から継承するカスタムテーブルビューセルクラスを実装しましたUITableViewCell。テーブルビューには背景画像が含まれているので、セルの背景を透明にします。iOS7以前は見栄えが良いです。

ただし、iOS7では、セルは常に白い背景で表示されます。


Xcode7、2015でも、ストーリーボードにバグがあります。コードでセルの背景色を設定する必要があります。


プロパティの背景色にアクセスして、セルの背景色を直接変更できます。cell.backgroundColor = [UIColor clearColor];
ViruMax 2014

回答:


384

Apple DOCが言ったように(UITableViewCell Class Reference):

... iOS 7では、セルのデフォルトの背景は白です。以前のバージョンのiOSでは、セルは外側のテーブルビューの背景色を継承します。セルの背景色を変更する場合は、テーブルビューデリゲートのtableView:willDisplayCell:forRowAtIndexPath:メソッドで変更します。

したがって、透明な背景でセルを表示するには、次のようにテーブルビューコントローラーにデリゲートメソッドを実装する必要があります。

- (void)tableView:(UITableView *)tableView
  willDisplayCell:(UITableViewCell *)cell
forRowAtIndexPath:(NSIndexPath *)indexPath
{
  [cell setBackgroundColor:[UIColor clearColor]];
}

ただ注意:@nullが言ったように、「...インターフェースビルダーにバグがあるようです...」、それがバグを持っているかどうかは完全にはわかりませんが、彼のコメントがいくつかの賛成票を獲得したようです。したがって、IBを使用する場合、何か問題があるかもしれません。:)


53
残念ながら真実ではありません。インターフェイスビルダーにバグがあるようで、ストーリーボードからカスタムセルに設定できませんでした。
Tarek Hallak 2013

1
@null、ああ、iOS 7 SDKにはまだ多くのバグを修正する必要があるようです。私はすでにいくつか会ったことがありますが、ストーリーボード関連については、私にはわかりません。:)
Kjuly 2013

4
tableView:cellForRowAtIndexPath:メソッドでこれを行うこともできます。
Bugloaf 2013年

1
@KendallHelmstetterGelnerよろしいですか?まだ気づいていないのですが、まだうまくいくようです。:)
Kjuly

1
バグローフが上記のように言っているように、tableView:cellForRowAtIndexPath:
amergin

66

少し調べてみると、セルのbackgroundColorがAppearanceシステムによって設定されていることがわかりました。したがって、アプリケーションのすべてのセルの背景が明確な場合、最も簡単な解決策は次のとおりです。

[[UITableViewCell appearance] setBackgroundColor:[UIColor clearColor]];

また、背景が異なっていても、デフォルトではクリアカラーが一番便利なようです。


1
あなたは私の友達はモンスターです。私はサブクラスのすべての私UITableViewCellのを、私はにBGの色を設定する初期化子でスーパークラスを提供することは問題ではなかったのでclearColor、しかし、何を思いますか?それはうまくいきませんでした...つまり、なぜ、APPLE?
Mazyod 2013

これは機能します。ただし、白い色が見えなくなります。最高の効果を得るためにトップレスポンスで行った(飛び出しなし)。
Carl Prehn、2014年

@Anton Filimonov Appdelegateのテーブルビューセルの外観を特定のviewControllerに設定しました。セルに異なる色を設定したいのですが、このシナリオにどのようにアプローチできますか?CellWillDisplayデリゲートメソッドで別の色を設定しようとしましたが、効果はありません。あなたは、この上のヘルプ私を喜ばでした
ピアモハメドThabib

@PeerMohamedThabibは、環境(iPad / iPhone、iOSバージョン)について詳しく教え、コードを提供してください。そして実際に自分で状況を調査することができます-UITableViewCellのサブクラスを作成し、setBackgroundColor:メソッドを再定義し(内部でスーパークラスの実装を呼び出すだけ)、このメソッドにブレークポイントを置くと、設定後にセルの色が変わるのがわかりますtableView:willDisplayCellAtIndexPath内:
Anton Filimonov

1
セルが混在している場合でも、背景があるものとないもの(透明)があります。最も簡単な方法は、カスタムクラスを定義して同じコードを記述することです。これにより、すべてのUITableViewCellクラスがすべてデフォルトのままになり、カスタムクラスの色がクリアになります。 [[CustomTableCell外観] setBackgroundColor:[UIColor clearColor]]; これはデフォルトのUITableViewCellsには​​影響せず、カスタムセルにのみ影響を与えます。
Ansari

30

セルを返す前に、これをcellForRowAtIndexPathメソッドに書き込みます。

cell.backgroundColor = [UIColor clearColor];

1
これはiPhone 5の上のiOS 8の問題で私を助けた
アルモ

13

UITableViewCelliOS 7 のデフォルトの背景色は白です。

backgroundColorプロパティをコードのどこかに設定する必要があります。たとえば、セルを新しく作成した後に設定します。

cell.backgroundColor = [UIColor clearColor];

試しましたがうまくいきませんでした。動作しますか?
Matrosov Alexander 2013

initWithCoder:aDecoderメソッドのカスタムテーブルビューセルで使用できます。
ftvs 2015年

13

この問題は、UITableViewの背景色がクリアに設定されていないことが原因であることがわかりました。UITableViewCellの背景色をクリアに変更しても白が表示される場合は、UITableViewの背景色がクリア(または必要なもの)に設定されていることを確認してください。

[self.tableView setBackgroundView:nil];
[self.tableView setBackgroundColor:[UIColor clearColor]];

スウィフトで

tableView.backgroundView = nil
tableView.backgroundColor = UIColor.clearColor()

参考までに、これをIBで設定することもできます。「テーブル」セクションだけでなく、「ビュー」セクションでも背景色を変更してください。
AndyDunn 2014年

1
これも私にとってはうまくいきました、私はそれの迅速なバージョンを探していました。コードに私にとってうまくいったことを追加しました:)
Mugunthan Balakrishnan '21 / 09/21

10

これは間違いなくiOSのバグです。iOS 8では、Interface BuilderiPhoneの背景色の設定は問題なく機能しますが、iPadでは常に機能しwhiteColorます。これを修正するには、cellForIndexPathデータソースメッセージで次のように記述します。

cell.backgroundColor = cell.backgroundColor

そしてそれはうまくいきます。これがまさに、コード自体がほとんどbullsh * tであるためバグであると私が言った理由ですが、機能します。


Xcode7 / iOS9の場合も同様です。上記のように、tableView:willDisplayCell:forRowAtIndexPathに明示的なコードを追加しました。
Andrew Duncan

XCode 7.0.1でコンパイルしているユニバーサルアプリは、iOS 7,8,9を実行しているiPhoneでは黒の背景を示しましたが、iOS 9.0.2を実行しているiPadでは白の背景を示しました(おそらく他のものは確認できません)。上記のコードはそれを修正しました。
ScottyB 2015年

静的なtableViewの場合、cell.backgroundColor = UIColor.clearColor()でwillDisplayCellをオーバーライドします。IBで色設定を再割り当てしてもうまくいきませんでした。
Viktor Kucera 2016年

4

UITableViewCellがデフォルトで選択されている可能性があります。Xcode6の新しいビジュアルデバッガーを使用してこれを確認できます(または、この白いセルが表示される原因となっているビューを正確に特定します)。

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

興味深いことに、これを知った後、選択したセルの背景色をクリアに設定してもまだ動作しませんでした。さらに調査を行ったところ、このカスタムセルを作成するときに、選択スタイルを変更する必要があることがわかりました。

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        // do customization here
    }
    self.selectionStyle = UITableViewCellSelectionStyleNone;
    [self setBackgroundColor:[UIColor clearColor]];
    return self;
}

ビジュアルデバッガーのリンク切れ
Suragch

3

上記のいずれもXCode 5.1.1、iOS 7.1では機能しないことがわかりました。

プロトタイプセルでインターフェイスビルダーを使用している場合は、プロトタイプセルを選択し、[表示]セクションの属性セレクターから、背景フォームのデフォルトを[クリアカラー]に変更します。

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

これは正常に動作するようです。上記のコード変更も必要ありません-これは純粋なIBソリューションです。


2

受け入れられた答えは私にとって問題を解決しませんでした。私はこれをしなければなりませんでした:

  1. インターフェイスビルダーで、テーブルビューを選択します。次に、属性インスペクタの[表示]セクションで、背景を透明(不透明度0%)に設定します。

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

  1. テーブルのデータソースクラスのcellForRowAtIndexPathメソッドから:

    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
        reuseIdentifier:CellIdentifier];
    cell.backgroundColor = [UIColor clearColor]; //Make cell transparent

ええと、あなたはインターフェイスビルダーを使用しています。@ nullが私の回答の下にコメントしているように、「...インターフェイスビルダーにバグがあるようです...」、バグがあるかどうかは完全にはわかりませんが、コメントはいくつかの賛成票を獲得しました。;)
Kjuly 2013年

透明なセルの背景になると、iOS7の何かは間違いなくバグがあります。私の答えが私と同じような状況に直面している他の人の助けになることを願っています。
RajV 2013年

これは、特にインターフェイスビルダー/ストーリーボードを使用している場合、テーブルビューのセルを作成する正しい方法ではありません。コードスニペットでは、デリゲートが要求されるたびに新しいセルを作成していますが、これは再利用されません。セル再利用のパフォーマンス上の利点を得るには、を使用する必要がありますcell = [tableView dequeueReusableCellWithIdentifier:<#Reuse ID#> forIndexPath:indexPath]。以前のバージョンでは、indexPath引数を削除してからnilをテストinitWithStyle:reuseIdentifierし、nilの場合はコードスニペットに従ってインスタンス化しました。
ikuramedia 2013年

ikuramedia:再利用コードを投稿から外しました。もちろん、私は細胞を再利用します。それがこの投稿のポイントではありません。
RajV 2013年

2

私にとって は、仕事に就いcell.backgroundColor = cell.contentView.backgroundColor;tableView:willDisplayCell:forRowAtIndexPath:tableView:cell:forRowAtIndexPath:、仕事をしました。

これは、必要に応じて、Interface BuilderでcontentViewの背景色を設定したためです。


1

セルにUIオブジェクトを追加すると、Xcode 5 / IOS 7は新しい「コンテンツビュー」を追加します。これは、セル内のすべての要素のスーパービューになります。セルの背景色を設定するには、このコンテンツビューの背景色を設定します。上記の解決策は私にとってはうまくいきませんでしたが、これは私にとってはうまくいきました。


コンテンツビューは以前のSDKバージョンでも使用できます。セルの背景ビューを覆うコンテンツビューの背景色を設定するだけです。
Kjuly 2013年

まあ、それはxcode 5以前のインターフェースビルダーでは自動的にポップアップしません。あなたの正確なポイントは何ですか?
DrBug 2013年

つまり、私の質問ではなく、別の問題についてあなたの答えが議論されました。セルの背景色を設定したいだけですよね?したがって、セルの背景がデフォルトで白いかどうかに関係なく、iOS 7ではコンテンツビューの色を設定することでいつでも実装できます。これにより、コンテンツビューがセルの背景ビューの上に表示されます。理にかなっていますか?;)
Kjuly 2013年

1

Swift 1.2ソリューション:

次のように、セルの背景色の明示的な定義を追加するだけです。

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    // Configure the cell...
    cell.backgroundColor = UIColor.clearColor()

    return cell
}

ごめんなさい。それは私の悪いです。できます。他のいくつかの設定を見逃しました。
Sung Kim

1

同様の問題があり、

  1. selectionStyleを青に設定し、
  2. これをコードに追加して修正します

    override func tableView(tableView: UITableView, shouldHighlightRowAtIndexPath indexPath: NSIndexPath) -> Bool {
    
      var bgColorView: UIView = UIView()
      bgColorView.backgroundColor = UIColor(red: (76.0 / 255.0), green: (161.0 / 255.0), blue: (255.0 / 255.0), alpha: 1.0)
      bgColorView.layer.masksToBounds = true
      tableView.cellForRowAtIndexPath(indexPath)!.selectedBackgroundView = bgColorView
      return true
    }

0

UITableViewセルを有利にするために、カラーコードを使用することもできます。

[cell setBackgroundColor:[self colorWithHexString:@"1fbbff"]];

これは、カラーコードメソッドを適用するためのコードです。

-(UIColor*)colorWithHexString:(NSString*)hex
{
    NSString *cString = [[hex stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] uppercaseString];


    if ([cString length] < 6) return [UIColor grayColor];

    if ([cString hasPrefix:@"0X"]) cString = [cString substringFromIndex:2];

    if ([cString length] != 6) return  [UIColor grayColor];

    NSRange range;
    range.location = 0;
    range.length = 2;
    NSString *rString = [cString substringWithRange:range];

    range.location = 2;
    NSString *gString = [cString substringWithRange:range];

    range.location = 4;
    NSString *bString = [cString substringWithRange:range];

    unsigned int r, g, b;
    [[NSScanner scannerWithString:rString] scanHexInt:&r];
    [[NSScanner scannerWithString:gString] scanHexInt:&g];
    [[NSScanner scannerWithString:bString] scanHexInt:&b];

    return [UIColor colorWithRed:((float) r / 255.0f)
                         green:((float) g / 255.0f)
                          blue:((float) b / 255.0f)
                         alpha:1.0f];
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.