web-dev-qa-db-ja.com

UITableViewCell:isSelectedプロパティを持たない青色の選択背景を防ぐ方法は?

カスタムUITableViewCellサブクラスがあります。セルサブクラスのcontentViewをカスタムUIViewクラスに設定しました。ここで-drawRect:をオーバーライドし、そこですべての描画を行っています。

また、セルの特定の領域で透過性を実現するためにcell.contentView.opaque = NOを設定しています(残念ながら、表の背後にある背景画像は、スタイルの効果を実現するために特定の部分の各セルを通して表示する必要があります。これはパフォーマンスです。ヒットします。そうでなければなりません)。

問題:セルが選択または強調表示されている(押されている)と、デフォルトのかなり青いグラデーションの背景がセルの後ろ(透明な領域)に描画されます。これはテーブルの後ろの画像を覆い隠していますが、これは悪いことです。

目標:青色のグラデーションの背景が表示されないようにする一方で、cell.isSelected内からcell.isHighlightedプロパティと-[MyContentView drawRect:]プロパティを調べて、独自のカスタム選択/強調表示を描画する方法を決定する。

私が試したこと:

  1. cell.selectionStyle = UITableViewCellSelectionStyleNoneを設定すると、かなり青いグラデーションの選択の背景を防ぐ効果がありますが、cell.isSelectedおよびcell.isHighlightedプロパティが正しく設定されないため、独自のカスタム選択を行うことができません/ハイライト描画

  2. セルのcell.selectionBackgroundView = nilまたはcell.backgroundView = nilメソッドで-initおよび-prepareForReuseを設定しても、青のグラデーション選択背景が妨げられない

  3. cell.selectionBackgroundView = nilメソッドの-[MyContentView -drawRect:]の設定doesは、青のグラデーション選択の背景を防ぐ効果がありますが、これは非常にぎこちないように見えます

  4. -[UITableViewCell setSelected:animated:]をオーバーライドして何もしないようにします。これには、青のグラデーションの選択背景を防ぐという望ましい効果はありません。

38

UITableViewsのカスタマイズに関する優れたリソースは、Matt Gallagherによる この投稿 です。あなたがやりたいことは、selectedBackgroundViewを(nilではなく)新しいビューに設定し、透明またはUIImageViewにすることです。

47
Jason

また、青色のグラデーションが表示されないようにするには、setHighlighted:をオーバーライドする必要があります。 setHighlighted:をオーバーライドするだけの場合、一時的な選択効果が発生します。

したがって、次の2つの方法があります。

- (void)setHighlighted: (BOOL)highlighted animated: (BOOL)animated
{
    // don't highlight
}

- (void)setSelected: (BOOL)selected animated: (BOOL)animated 
{
    // don't select
    //[super setSelected:selected animated:animated];
}
68
jessecurry
cell.selectionStyle = UITableViewCellSelectionStyleNone;
61
Mugunth

これを実現するためのはるかに簡単な方法-私の意見では-これを実現するには、Interface Builder画面の[タッチ時に選択を表示]と表示されている[テーブルビュー属性]チェックボックスを設定します。以下のスクリーンショットをご覧ください。

enter image description here

1
Max MacLeod