UITableView内のすべてのUITableViewCellの背景(および場合によっては境界線も)をカスタマイズしたいと思います。これまでのところ、このようなものをカスタマイズすることはできなかったので、デフォルトの白い背景セルがたくさんあります。
iPhone SDKでこれを行う方法はありますか?
UITableView内のすべてのUITableViewCellの背景(および場合によっては境界線も)をカスタマイズしたいと思います。これまでのところ、このようなものをカスタマイズすることはできなかったので、デフォルトの白い背景セルがたくさんあります。
iPhone SDKでこれを行う方法はありますか?
この問題を解決するために私が遭遇した最も効率的な方法は次のとおりです。 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]];
この解決策は私の状況ではうまくいきました...
セルの contentView の backgroundColor を自分の色に設定する必要があります。アクセサリ (開示矢印など) を使用すると、それらは白く表示されるため、それらのカスタム バージョンを作成する必要がある場合があります。
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 をカスタムに設定した場合にも機能します。
ビューを作成し、これをセルの背景ビューとして設定します
UIView *lab = [[UIView alloc] initWithFrame:cell.frame];
[lab setBackgroundColor:[UIColor grayColor]];
cell.backgroundView = lab;
[lab release];
私の解決策は、次のコードを 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];
開示ボタンがあっても、どのような状況でも機能し、ロジックが cellForRowAtIndexPath のセルの色の状態に作用する方が、 cellWillShow イベントよりも優れていると思います。
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"]];
}