選択したセルごとに、UITableViewCellを使用してセルの背景色を変更する方法を知っていますか? TableViewのコード内にこのUITableViewCellを作成しました。
プロパティ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];
最終的に、スタイルをグループ化に設定したテーブルビューでこれを機能させることができました。
最初に、すべてのセルの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];
}
}
// 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];
}
}
いくつかのテストの後、これは[〜#〜] 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プロパティを何にも設定できますが、なしに設定できます。
スタイル:プレーン、選択:単一選択
スタイル:プレーン、選択:複数選択
スタイル:グループ化、選択:複数選択
よりスムーズな色の遷移のために、いくつかのアニメーションを試してください:
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
})
}
}
}
セルを選択すると、アイコンとテキストの色も変わることがあります。これは、UIImageおよびUILabel Highlightedプロパティを設定すると自動的に発生します
UIImage
UILabel
Highlightedプロパティに色を指定するだけです:
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = (UITableViewCell *)[tableView cellForRowAtIndexPath:indexPath];
cell.contentView.backgroundColor = [UIColor yellowColor];
}
UIViewを作成し、セルselectedBackgroundViewのプロパティを設定します。
UIView *v = [[UIView alloc] init];
v.backgroundColor = [UIColor redColor];
cell.selectedBackgroundView = v;
選択したセルについて話している場合、プロパティは-selectedBackgroundView
。これは、ユーザーがセルを選択したときに表示されます。
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())
}
高度にカスタマイズされた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];
私は次のような運に恵まれました。
- (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];
}
}
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];
お役に立てれば。 :)
灰色の背景色を削除するだけの場合は、次のようにします。
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
[[tableView cellForRowAtIndexPath:indexPath] setSelectionStyle:UITableViewCellSelectionStyleNone];
}
これはグループ化された呼び出しで完全に機能しました: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]];
}
デフォルトのスタイルはグレーで、プログラムで実行するとセルの色が破壊されます。これを回避することができます。 (Swiftで)cell.selectionStyle = .None
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
}
}
(ただし、ビューは、指を離して選択を確認した後にのみ変更されます)
Appleのサンプルコード のAdvancedTableViewCells
を確認してください。
複合セルパターンを使用します。
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
}
私のために働く
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;
カスタム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()
}
}
override func setSelected(_ selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
if selected {
self.contentView.backgroundColor = .black
} else {
self.contentView.backgroundColor = .white
}
}
Interface Builder(ストーリーボード内)でこれを行う簡単な方法を次に示します。次のように、シンプルなUIViewをUITableViewの上部にドラッグします 次に、セルのselectedBackgroundView
Outletをこのビューに接続します。複数のセルのコンセントをこの1つのビューに接続することもできます。
- (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;
}
UIAppearance
をサブクラス化してiOS 7(およびそれ以上)のUITableViewCell
で(適切に)動作するソリューションの場合デフォルトのselectedBackgroundView
を使用して色を設定し、同様の質問に対する私の答えを見てください here 。
上記の回答の中からそれぞれ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;
}
他のすべてに対するこのメソッドの利点は次のとおりです。
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
}
}
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
}