質問

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。"

thisでこの情報を見つけました。コリオネルからの投稿。彼に感謝!

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

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

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"]];
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top