UITableViewCellの背景色をカスタマイズする方法は?
-
07-07-2019 - |
質問
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];
}
PS:ここでは、willDisplayCellのドキュメントの抜粋:
"テーブルビューはこのメッセージを セルを使用する直前のデリゲート 行を描画し、それにより セルオブジェクトをカスタマイズするデリゲート 表示される前。この方法 デリゲートに次の機会を与えます 状態ベースのプロパティセットをオーバーライドする 前のようなテーブルビューで 選択と背景色。後 デリゲートが戻り、テーブルビュー アルファとフレームのみを設定します プロパティ、その後のみ 行がスライドするときの行のアニメーション化または out。"
これまでに見つけた最良のアプローチは、セルの背景ビューを設定し、セルのサブビューの背景をクリアすることです。もちろん、これは、アクセサリの有無に関係なく、インデックス付きスタイルのみのテーブルで見栄えがします。
これは、セルの背景が黄色にパントされているサンプルです。
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」を設定します)、これが私がやろうとしていたことです。
テーブルビューセルの背景をカスタマイズすると、最終的に「すべてまたは何もない」になります。アプローチ。コンテンツセルの背景に使用される色や画像を、見た目が変にならないように変更することは非常に困難です。
その理由は、セルが実際にビューの幅にまたがっているからです。丸い角は描画スタイルの一部であり、コンテンツビューはこの領域にあります。
コンテンツセルの色を変更すると、隅に白いビットが表示されます。セル全体の色を変更すると、ビューの幅全体に色のブロックができます。
セルは間違いなくカスタマイズできますが、最初に考えるほど簡単ではありません。
ビューを作成し、これをセルの背景ビューとして設定します
UIView *lab = [[UIView alloc] initWithFrame:cell.frame];
[lab setBackgroundColor:[UIColor grayColor]];
cell.backgroundView = lab;
[lab release];
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のセルの色の状態にロジックを作用させる方が良いと思います。
UITableViewCellをサブクラス化し、これを実装に追加します。
-(void)layoutSubviews
{
[super layoutSubviews];
self.backgroundColor = [UIColor blueColor];
}
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];
これは最新のXcodeで動作します。
-(UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath {
cell.backgroundColor = [UIColor grayColor];
}
これを試してください:
- (void)tableView:(UITableView *)tableView1 willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
[cell setBackgroundColor:[UIColor clearColor]];
tableView1.backgroundColor = [UIColor colorWithPatternImage: [UIImage imageNamed: @"Cream.jpg"]];
}