web-dev-qa-db-ja.com

選択したセルの背景色を変更しますか?

選択したセルごとに、UITableViewCellを使用してセルの背景色を変更する方法を知っていますか? TableViewのコード内にこのUITableViewCellを作成しました。

48
sg.

プロパティselectedBackgroundViewの変更は正確で最も簡単な方法です。次のコードを使用して、選択色を変更します。

// set selection color
UIView *myBackView = [[UIView alloc] initWithFrame:cell.frame];
myBackView.backgroundColor = [UIColor colorWithRed:1 green:1 blue:0.75 alpha:1];
cell.selectedBackgroundView = myBackView;
[myBackView release];
92
Chilly Zhong

最終的に、スタイルをグループ化に設定したテーブルビューでこれを機能させることができました。

最初に、すべてのセルのselectionStyleプロパティをUITableViewCellSelectionStyleNoneに設定します。

cell.selectionStyle = UITableViewCellSelectionStyleNone;

次に、テーブルビューデリゲートで次を実装します。

static NSColor *SelectedCellBGColor = ...;
static NSColor *NotSelectedCellBGColor = ...;

- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSIndexPath *currentSelectedIndexPath = [tableView indexPathForSelectedRow];
    if (currentSelectedIndexPath != nil)
    {
        [[tableView cellForRowAtIndexPath:currentSelectedIndexPath] setBackgroundColor:NotSelectedCellBGColor];
    }

    return indexPath;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [[tableView cellForRowAtIndexPath:indexPath] setBackgroundColor:SelectedCellBGColor];
}

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (cell.isSelected == YES)
    {
        [cell setBackgroundColor:SelectedCellBGColor];
    }
    else
    {
        [cell setBackgroundColor:NotSelectedCellBGColor];
    }
}
37
loomer
// animate between regular and selected state
- (void)setSelected:(BOOL)selected animated:(BOOL)animated {

    [super setSelected:selected animated:animated];

    if (selected) {
        self.backgroundColor = [UIColor colorWithRed:234.0f/255 green:202.0f/255 blue:255.0f/255 alpha:1.0f];
    }
    else {
        self.backgroundColor = [UIColor clearColor];
    }
}
19
PK86

Swift 4、XCODE 9、IOS 11

いくつかのテストの後、これは[〜#〜] will [〜#〜]選択を解除するか、テーブルビューの選択時にセルを2回タップすると背景色を削除します。 「複数選択」に設定されます。テーブルビューのスタイルが「グループ化」に設定されている場合にも機能します。

extension ViewController: UITableViewDelegate {
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        if let cell = tableView.cellForRow(at: indexPath) {
            cell.contentView.backgroundColor = UIColor.darkGray
        }
    }
}

注:以下に示すようにこれが機能するためには、セルのSelectionプロパティを何にも設定できますが、なしに設定できます。

さまざまなオプションでどのように見えるか

スタイル:プレーン、選択:単一選択

Single Selection

スタイル:プレーン、選択:複数選択

Multiple Selection

スタイル:グループ化、選択:複数選択

Grouped Multiple Selection

ボーナス-アニメーション

よりスムーズな色の遷移のために、いくつかのアニメーションを試してください:

extension ViewController: UITableViewDelegate {
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        if let cell = tableView.cellForRow(at: indexPath) {
            UIView.animate(withDuration: 0.3, animations: {
                cell.contentView.backgroundColor = UIColor.darkGray
            })
        }
    }
}

Animated color transition

ボーナス-テキストと画像の変更

セルを選択すると、アイコンとテキストの色も変わることがあります。これは、UIImageおよびUILabel Highlightedプロパティを設定すると自動的に発生します

UIImage

  1. 2つのカラー画像を提供します。

Two colored images

  1. Highlighted imageプロパティを設定します。

Highlighted property

UILabel

Highlightedプロパティに色を指定するだけです:

Highlighted Color

12
Mark Moeykens
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

     UITableViewCell *cell = (UITableViewCell *)[tableView cellForRowAtIndexPath:indexPath];
     cell.contentView.backgroundColor = [UIColor yellowColor];

}
11
Salim

UIViewを作成し、セルselectedBackgroundViewのプロパティを設定します。

UIView *v = [[UIView alloc] init];
v.backgroundColor = [UIColor redColor];
cell.selectedBackgroundView = v;
10
Yerkezhan

選択したセルについて話している場合、プロパティは-selectedBackgroundView。これは、ユーザーがセルを選択したときに表示されます。

7
Steven Canfield

IOS7 +の場合、およびInterface Builderを使用している場合、セルをサブクラス化して実装します。

Objective-C

- (void)awakeFromNib {
    [super awakeFromNib];
    // Default Select background
    UIView *v = [[UIView alloc] init];
    v.backgroundColor = [UIColor redColor];
    self.selectedBackgroundView = v;
}

Swift 2.2

override func awakeFromNib() {
    super.awakeFromNib()
    // Default Select background
    self.selectedBackgroundView = { view in
        view.backgroundColor = .redColor()
        return view
    }(UIView())
}
6
Peter Lapisu

高度にカスタマイズされたUITableViewCellがあります。そこで、独自のセル選択を実装しました。

cell.selectionStyle = UITableViewCellSelectionStyleNone;

私のセルのクラスにメソッドを作成しました:

- (void)highlightCell:(BOOL)highlight
{
    if (highlight) {
        self.contentView.backgroundColor = RGB(0x355881);
        _bodyLabel.textColor = RGB(0xffffff);
        _fromLabel.textColor = RGB(0xffffff);
        _subjectLabel.textColor = RGB(0xffffff);
        _dateLabel.textColor = RGB(0xffffff);
    }
    else {
        self.contentView.backgroundColor = RGB(0xf7f7f7);;
        _bodyLabel.textColor = RGB(0xaaaaaa);
        _fromLabel.textColor = [UIColor blackColor];
        _subjectLabel.textColor = [UIColor blackColor];
        _dateLabel.textColor = RGB(0x496487);
    }
}

ViewWillAppearの私のUITableViewControllerクラスにこれを追加しました:

NSIndexPath *tableSelection = [self.tableView indexPathForSelectedRow];
SideSwipeTableViewCell *cell = (SideSwipeTableViewCell*)[self.tableView cellForRowAtIndexPath:tableSelection];
[cell highlightCell:NO];

DidSelectRowでこれを追加しました:

SideSwipeTableViewCell *cell = (SideSwipeTableViewCell*)[self.tableView cellForRowAtIndexPath:indexPath];
[cell highlightCell:YES];
6
wzbozon

私は次のような運に恵まれました。

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    bool isSelected = // enter your own code here
    if (isSelected)
    {
        [cell setBackgroundColor:[UIColor colorWithRed:1 green:1 blue:0.75 alpha:1]];
        [cell setAccessibilityTraits:UIAccessibilityTraitSelected];
    }
    else
    {
        [cell setBackgroundColor:[UIColor clearColor]];
        [cell setAccessibilityTraits:0];
    }
}
6
sehugg

UITableViewCellのサブクラスを作成し、setSelected:animated:メソッドを実装することで、この問題を解決できました。

- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
    [super setSelected:selected animated:animated];

    // Configure the view for the selected state
    if(selected) {
        [self setSelectionStyle:UITableViewCellSelectionStyleNone];
        [self setBackgroundColor:[UIColor greenColor]];
    } else {
        [self setBackgroundColor:[UIColor whiteColor]];
    }
}

トリックは

cell.selectionStyle = UITableViewCellSelectionStyleDefault;

実装するView Controllerで、次にtableViewCellで

[self setSelectionStyle:UITableViewCellSelectionStyleNone];

お役に立てれば。 :)

5
illuminate

灰色の背景色を削除するだけの場合は、次のようにします。

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
     [[tableView cellForRowAtIndexPath:indexPath] setSelectionStyle:UITableViewCellSelectionStyleNone];
}     
5
Coolsinus

これはグループ化された呼び出しで完全に機能しました:UITableViewCellのカスタムサブクラスを実装します

これはコーナーなどを尊重します...

- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
    [super setSelected:selected animated:animated];

    if(selected)
        [self setBackgroundColor:[UIColor colorWithRed:(245/255.0) green:(255/255.0) blue:(255/255.0) alpha:1]];
    else
        [self setBackgroundColor:[UIColor whiteColor]];

}
5
theprojectabot

デフォルトのスタイルはグレーで、プログラムで実行するとセルの色が破壊されます。これを回避することができます。 (Swiftで)
cell.selectionStyle = .None

4
726a

in Swift 3、照明回答から変換。

override func setSelected(_ selected: Bool, animated: Bool) {
    super.setSelected(selected, animated: animated)
    if(selected) {
        self.selectionStyle = .none
        self.backgroundColor = UIColor.green
    } else {
        self.backgroundColor = UIColor.blue
    }
}

(ただし、ビューは、指を離して選択を確認した後にのみ変更されます)

3
Peter Johnson

AppleのサンプルコードAdvancedTableViewCellsを確認してください。

複合セルパターンを使用します。

3
johndpope

In Swift

let v = UIView()
    v.backgroundColor = self.darkerColor(color)
    cell?.selectedBackgroundView = v;

...

func darkerColor( color: UIColor) -> UIColor {
    var h = CGFloat(0)
    var s = CGFloat(0)
    var b = CGFloat(0)
    var a = CGFloat(0)
    let hueObtained = color.getHue(&h, saturation: &s, brightness: &b, alpha: &a)
    if hueObtained {
        return UIColor(hue: h, saturation: s, brightness: b * 0.75, alpha: a)
    }
    return color
}
3

私のために働く

UIView *customColorView = [[UIView alloc] init];
    customColorView.backgroundColor = [UIColor colorWithRed:180/255.0 
                                                      green:138/255.0 
                                                       blue:171/255.0 
                                                      alpha:0.5];
    cell.selectedBackgroundView =  customColorView;
2
Mrsantateam

カスタムUITableViewCellを作成します。カスタムクラス内で「setSelected」関数をオーバーライドし、contentView背景色を変更します。 「setHighlighted」関数をオーバーライドすることもできます。

Swiftの場合:

class myTableViewCell: UITableViewCell {

    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
    }

    override func setSelected(selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)

        // Configure the view for the selected state
        // Add your color here
        self.contentView.backgroundColor = UIColor.whiteColor()
    }

    override func setHighlighted(highlighted: Bool, animated: Bool) {
        // Add your color here
        self.contentView.backgroundColor = UIColor.whiteColor()
    }
}
2
Eduardo Irias
override func setSelected(_ selected: Bool, animated: Bool) {
    super.setSelected(selected, animated: animated)

    if selected {
        self.contentView.backgroundColor = .black
    } else {
        self.contentView.backgroundColor = .white
    }
}
1
Daniel Simons

Interface Builder(ストーリーボード内)でこれを行う簡単な方法を次に示します。次のように、シンプルなUIViewをUITableViewの上部にドラッグします UIView 次に、セルのselectedBackgroundView Outletをこのビューに接続します。複数のセルのコンセントをこの1つのビューに接続することもできます。 Cell's outlet

1
Sebastian
- (void)tableView:(UITableView *)tableView didHighlightRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = (UITableViewCell *)[tableView cellForRowAtIndexPath:indexPath];
    cell.contentView.backgroundColor = [UIColor yellowColor];
}

- (void)tableView:(UITableView *)tableView didUnhighlightRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = (UITableViewCell *)[tableView cellForRowAtIndexPath:indexPath];
    cell.contentView.backgroundColor = nil;
}
1
tuoxie007

UIAppearanceをサブクラス化してiOS 7(およびそれ以上)のUITableViewCellで(適切に)動作するソリューションの場合デフォルトのselectedBackgroundViewを使用して色を設定し、同様の質問に対する私の答えを見てください here

1
anneblue

上記の回答の中からそれぞれ1つを試してみましたが、私に最適なものはありません。

その後、ネイティブで提供されているメソッドの1つを調べましたが、正常に機能しています。

まず、cellSelectionStyleをNoneに設定してから、このソリューションに進みます。

func tableView(_ tableView: UITableView, willDeselectRowAt indexPath: IndexPath) -> IndexPath?
{   
    let cell = tableView.cellForRow(at: indexPath);

   //cell which is getting deselected, make whatever changes that are required to make it back normal        

    cell.backgroundColor = kNormalColor;

    return indexPath;
}

func tableView(_ tableView: UITableView, willSelectRowAt indexPath: IndexPath) -> IndexPath?
{
    let cell = tableView.cellForRow(at: indexPath);

   //cell which is getting selected, make whatever changes that are required to make it selected        

    cell.backgroundColor = kSelectedColor;

    return indexPath;
}

他のすべてに対するこのメソッドの利点は次のとおりです。

  1. 複数のセルを選択できる
  2. 選択したセルと選択解除したセルの背景色だけでなく、任意の要素を変更できます。
0
Mehul Thakkar

Swift 3、4、5セルの背景色を選択

1)ユーザーがセルをクリックしたときに強調表示された色のみを変更する:

1.1)内部セルクラス:

override func awakeFromNib() {
    super.awakeFromNib()
    // Initialization code

    let backgroundView = UIView()
    backgroundView.backgroundColor = UIColor.init(white: 1.0, alpha: 0.1)
    selectedBackgroundView = backgroundView
}

1.2)カスタマイズされたセルを使用するViewcontroller

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    tableView.deselectRow(at: indexPath, animated: true)
}

2)選択したセルの色を設定する場合:

override func setSelected(_ selected: Bool, animated: Bool) {
    super.setSelected(selected, animated: animated)
    // Configure the view for the selected state

    if selected {
        self.backgroundColor = .darkGray
    } else {
        self.backgroundColor = .white
    }
}
0
Doca
var last_selected:IndexPath!

クラス内でlast_selected:IndexPathを定義します

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let cell = tableView.cellForRow(at: indexPath) as! Cell
    cell.contentView.backgroundColor = UIColor.lightGray
    cell.txt.textColor = UIColor.red

    if(last_selected != nil){
        //deselect
        let deselect_cell = tableView.cellForRow(at: last_selected) as! Cell
        deselect_cell.contentView.backgroundColor = UIColor.white
        deselect_cell.txt.textColor = UIColor.black
    }

    last_selected = indexPath
}
0
Talha Ahmed