web-dev-qa-db-ja.com

UITableViewCellの背景色をカスタマイズする方法は?

UITableView内のすべてのUITableViewCellsの背景(およびおそらく境界線)をカスタマイズしたいと思います。これまでのところ、このようなものをカスタマイズすることができなかったため、デフォルトの白い背景セルがたくさんあります。

IPhone SDKでこれを行う方法はありますか?

186
jpm

セルのcontentViewのbackgroundColorを自分の色に設定する必要があります。アクセサリ(ディスクロージャー矢印など)を使用する場合、それらは白で表示されるため、それらのカスタムバージョンをロールする必要があります。

191
Ben Gottlieb

この問題を解決するために私が遭遇した最も効率的な方法は、willDisplayCellデリゲートメソッドを使用します(これは、cell.textLabel.textおよび/またはcell.detailTextLabel.textを使用するときにテキストラベルの背景の白色も処理します):

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { ... }

このデリゲートメソッドが呼び出されると、セルの色は、以下を使用するときのように、テーブルビューではなくセルを介して制御されます。

- (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath { ... }

したがって、セルデリゲートメソッドの本体内で、セルの代替色に次のコードを追加するか、関数呼び出しを使用してテーブルのすべてのセルを同じ色にします。

if (indexPath.row % 2)
{
    [cell setBackgroundColor:[UIColor colorWithRed:.8 green:.8 blue:1 alpha:1]];
}
else [cell setBackgroundColor:[UIColor clearColor]];

このソリューションは私の状況ではうまくいきました...

204
N.Berendt

OS 3.0は、willDisplayCellメソッドでセルの背景色を設定するだけなので、これは本当に簡単です。 cellForRowAtIndexPathで色を設定しないでください。

これは、プレーンスタイルとグループ化されたスタイルの両方で機能します。

コード:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    cell.backgroundColor = [UIColor redColor];
}

追伸:ここで、willDisplayCellのドキュメントの抜粋:

「テーブルビューは、セルを使用して行を描画する直前にこのメッセージをデリゲートに送信します。これにより、デリゲートはセルオブジェクトを表示する前にカスタマイズできます。このメソッドは、選択や背景色などのテーブルビュー。デリゲートが戻った後、テーブルビューはアルファプロパティとフレームプロパティのみを設定し、行がスライドインまたはスライドアウトするときにのみ行を設定します。

この情報は colionelからのこの投稿 にあります。彼に感謝!

104
Seba

これまでに見つけた最良のアプローチは、セルの背景ビューを設定し、セルのサブビューの背景をクリアすることです。もちろん、これは、付属品の有無にかかわらず、インデックス付きスタイルのみのテーブルでは見栄えがします。

以下は、セルの背景が黄色にパントされているサンプルです。

UIView* backgroundView = [ [ [ UIView alloc ] initWithFrame:CGRectZero ] autorelease ];
backgroundView.backgroundColor = [ UIColor yellowColor ];
cell.backgroundView = backgroundView;
for ( UIView* view in cell.contentView.subviews ) 
{
    view.backgroundColor = [ UIColor clearColor ];
}
57

これをUITableViewデリゲートクラスファイル(.m)に入れるだけです。

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell  forRowAtIndexPath:(NSIndexPath *)indexPath 
{
    UIColor *color = ((indexPath.row % 2) == 0) ? [UIColor colorWithRed:255.0/255 green:255.0/255 blue:145.0/255 alpha:1] : [UIColor clearColor];
    cell.backgroundColor = color;
}
19
JAG

Sebaに同意し、rowForIndexPathデリゲートメソッドで交互の行の色を設定しようとしましたが、3.2と4.2の間で一貫性のない結果を得ていました。以下は私にとってはうまくいきました。

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {

    if ((indexPath.row % 2) == 1) {
        cell.backgroundColor = UIColorFromRGB(0xEDEDED);
        cell.textLabel.backgroundColor = UIColorFromRGB(0xEDEDED);
        cell.selectionStyle = UITableViewCellSelectionStyleGray;
    }
    else
    {
        cell.backgroundColor = [UIColor whiteColor];
        cell.selectionStyle = UITableViewCellSelectionStyleGray;
    }

}
7
cipherz

さまざまなソリューションをすべて試した後、次の方法が最もエレガントな方法です。次のデリゲートメソッドで色を変更します。

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    if (...){
        cell.backgroundColor = [UIColor blueColor];
    } else {
        cell.backgroundColor = [UIColor whiteColor];
    }
}
6
Jim Huang

vlado.grigorovにはいくつかの良いアドバイスがあります。最良の方法はbackgroundViewを作成し、その色を指定して、他のすべてをclearColorに設定することです。また、私はその方法が色を正しくクリアする唯一の方法だと思います(彼のサンプルを試してください-しかし、「yellowColor」の代わりに「clearColor」を設定します)、これが私がやろうとしていたことです。

4
William Denniss

テーブルビューセルの背景をカスタマイズすることは、最終的に「すべてまたは何もしない」アプローチになります。コンテンツセルの背景に使用する色や画像を、見た目が変にならないように変更することは非常に困難です。

理由は、セルが実際にビューの幅にまたがっているからです。丸い角は描画スタイルの一部にすぎず、コンテンツビューはこの領域に配置されます。

コンテンツセルの色を変更すると、隅に白いビットが表示されます。セル全体の色を変更すると、ビューの幅全体に色のブロックができます。

セルは間違いなくカスタマイズできますが、最初は思ったほど簡単ではありません。

3
Andrew Grant

N.Berendtの答えを拡張するには-実際のセルデータオブジェクトの状態に基づいてセルの色を設定したい場合、テーブルセルの残りの情報を設定するときに、通常はcellForRowAtIndexPathメソッドでは、willDisplayCellメソッドをオーバーライドしてコンテンツビューの背景色からセルの背景色を設定することにより、これを行うことができます。これにより、開示ボタンの背景などが正しくないという問題を回避できますが、cellForRowAtIndexPathメソッドで色を制御できます他のセルのカスタマイズをすべて行っている場所。

そのため、このメソッドをTable Viewデリゲートに追加する場合:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    cell.backgroundColor = cell.contentView.backgroundColor;
}

次に、cellForRowAtIndexPathメソッドで次のことができます。

if (myCellDataObject.hasSomeStateThatMeansItShouldShowAsBlue) {
    cell.contentView.backgroundColor = [UIColor blueColor];
}

これにより、willDisplayCellメソッドでデータオブジェクトを再度取得する必要がなくなり、テーブルセルのカスタマイズ/カスタマイズを行う2つの場所が節約されます。すべてのカスタマイズはcellForRowAtIndexPathメソッドで行うことができます。

3
gamozzii

ビューを作成し、これをセルの背景ビューとして設定します

UIView *lab = [[UIView alloc] initWithFrame:cell.frame];
            [lab setBackgroundColor:[UIColor grayColor]];
            cell.backgroundView = lab;
            [lab release];
3
Senthil

Photoshopまたはgimpで背景として使用する画像を作成し、myimageという名前を付けます。次に、このメソッドをtableViewControllerクラスに追加します。

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    UIImage *cellImage = [UIImage imageNamed:@"myimage.png"];//myimage is a 20x50 px with  gradient  color created with gimp
    UIImageView *cellView = [[UIImageView alloc] initWithImage:cellImage];
    cellView.contentMode = UIContentViewModeScaleToFill;
    cell.backgroundView = cellView;
    //set the background label to clear
    cell.titleLabel.backgroundColor= [UIColor clearColor];
}

これは、属性インスペクターでUITableViewをカスタムに設定している場合にも機能します。

3
Davide

私の解決策は、cellForRowAtIndexPathイベントに次のコードを追加することです。

UIView *solidColor = [cell viewWithTag:100];
if (!solidColor) {

    solidColor = [[UIView alloc] initWithFrame:cell.bounds];
    solidColor.tag = 100; //Big tag to access the view afterwards
    [cell addSubview:solidColor];
    [cell sendSubviewToBack:solidColor];
    [solidColor release];
}
solidColor.backgroundColor = [UIColor colorWithRed:254.0/255.0
                                             green:233.0/255.0
                                              blue:233.0/255.0
                                             alpha:1.0];

開示ボタンがあっても、どのような状況でも機能し、cellWillShowイベントよりもcellForRowAtIndexPathのセルの色の状態にロジックを作用させる方がよいと思います。

これは最新のXcodeで機能します。

-(UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath {
    cell.backgroundColor = [UIColor grayColor];
}
1
Sameera R.
    UIView *bg = [[UIView alloc] initWithFrame:cell.frame];
    bg.backgroundColor = [UIColor colorWithRed:175.0/255.0 green:220.0/255.0 blue:186.0/255.0 alpha:1]; 
    cell.backgroundView = bg;
    [bg release];
1
Bhavesh Nayi

UITableViewCellをサブクラス化し、これを実装に追加します。

-(void)layoutSubviews
{
    [super layoutSubviews];
    self.backgroundColor = [UIColor blueColor];
}
1
JonahGabriel

これを試して:

- (void)tableView:(UITableView *)tableView1 willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    [cell setBackgroundColor:[UIColor clearColor]];
    tableView1.backgroundColor = [UIColor colorWithPatternImage: [UIImage imageNamed: @"Cream.jpg"]];
}
0
user4919266