UITableView内のすべてのUITableViewCellsの背景(およびおそらく境界線)をカスタマイズしたいと思います。これまでのところ、このようなものをカスタマイズすることができなかったため、デフォルトの白い背景セルがたくさんあります。
IPhone SDKでこれを行う方法はありますか?
セルのcontentViewのbackgroundColorを自分の色に設定する必要があります。アクセサリ(ディスクロージャー矢印など)を使用する場合、それらは白で表示されるため、それらのカスタムバージョンをロールする必要があります。
この問題を解決するために私が遭遇した最も効率的な方法は、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]];
このソリューションは私の状況ではうまくいきました...
OS 3.0は、willDisplayCellメソッドでセルの背景色を設定するだけなので、これは本当に簡単です。 cellForRowAtIndexPathで色を設定しないでください。
これは、プレーンスタイルとグループ化されたスタイルの両方で機能します。
コード:
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
cell.backgroundColor = [UIColor redColor];
}
追伸:ここで、willDisplayCellのドキュメントの抜粋:
「テーブルビューは、セルを使用して行を描画する直前にこのメッセージをデリゲートに送信します。これにより、デリゲートはセルオブジェクトを表示する前にカスタマイズできます。このメソッドは、選択や背景色などのテーブルビュー。デリゲートが戻った後、テーブルビューはアルファプロパティとフレームプロパティのみを設定し、行がスライドインまたはスライドアウトするときにのみ行を設定します。
この情報は colionelからのこの投稿 にあります。彼に感謝!
これまでに見つけた最良のアプローチは、セルの背景ビューを設定し、セルのサブビューの背景をクリアすることです。もちろん、これは、付属品の有無にかかわらず、インデックス付きスタイルのみのテーブルでは見栄えがします。
以下は、セルの背景が黄色にパントされているサンプルです。
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 ];
}
これを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;
}
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;
}
}
さまざまなソリューションをすべて試した後、次の方法が最もエレガントな方法です。次のデリゲートメソッドで色を変更します。
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
if (...){
cell.backgroundColor = [UIColor blueColor];
} else {
cell.backgroundColor = [UIColor whiteColor];
}
}
vlado.grigorovにはいくつかの良いアドバイスがあります。最良の方法はbackgroundViewを作成し、その色を指定して、他のすべてをclearColorに設定することです。また、私はその方法が色を正しくクリアする唯一の方法だと思います(彼のサンプルを試してください-しかし、「yellowColor」の代わりに「clearColor」を設定します)、これが私がやろうとしていたことです。
テーブルビューセルの背景をカスタマイズすることは、最終的に「すべてまたは何もしない」アプローチになります。コンテンツセルの背景に使用する色や画像を、見た目が変にならないように変更することは非常に困難です。
理由は、セルが実際にビューの幅にまたがっているからです。丸い角は描画スタイルの一部にすぎず、コンテンツビューはこの領域に配置されます。
コンテンツセルの色を変更すると、隅に白いビットが表示されます。セル全体の色を変更すると、ビューの幅全体に色のブロックができます。
セルは間違いなくカスタマイズできますが、最初は思ったほど簡単ではありません。
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メソッドで行うことができます。
ビューを作成し、これをセルの背景ビューとして設定します
UIView *lab = [[UIView alloc] initWithFrame:cell.frame];
[lab setBackgroundColor:[UIColor grayColor]];
cell.backgroundView = lab;
[lab release];
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をカスタムに設定している場合にも機能します。
私の解決策は、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];
}
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];
UITableViewCellをサブクラス化し、これを実装に追加します。
-(void)layoutSubviews
{
[super layoutSubviews];
self.backgroundColor = [UIColor blueColor];
}
これを試して:
- (void)tableView:(UITableView *)tableView1 willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
[cell setBackgroundColor:[UIColor clearColor]];
tableView1.backgroundColor = [UIColor colorWithPatternImage: [UIImage imageNamed: @"Cream.jpg"]];
}