回答:
セルのcontentViewのbackgroundColorを自分の色に設定する必要があります。アクセサリ(開閉用の矢印など)を使用している場合、白で表示されるため、それらのカスタムバージョンをロールする必要がある場合があります。
UITableViewCellAccessoryCheckmark
たとえば、自分のをロールバックする方法に関するリンクはありますか?ありがとう。
cell.textLabel.backgroundColor = [UIColor clearColor];
これは、この問題を解決するために出会った最も効率的な方法です。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]];
このソリューションは私の状況でうまくいきました...
cell.backgroundColor = UIColor.clearColor
OS 3.0はwillDisplayCellメソッドでセルの背景色を設定するだけなので、これは本当に簡単です。cellForRowAtIndexPathに色を設定しないでください。
これは、プレーンスタイルとグループスタイルの両方で機能します。
コード:
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
cell.backgroundColor = [UIColor redColor];
}
PS: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メソッドで色を制御できます。他のすべてのセルのカスタマイズを行う場所。
したがって、このメソッドをテーブルビューデリゲートに追加すると、次のようになります。
- (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メソッドで行うことができます。
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のセルの色の状態をロジックで処理する方が適切だと思います。