UITableViewCell:如何防止蓝色选择​​背景没有borking isSelected属性?

Tod*_*orf 38 iphone cocoa-touch objective-c uikit

我有一个自定义UITableViewCell子类.我已经将contentView我的单元子类设置为一个自定义UIView类,我在其中重写-drawRect:并完成所有绘图.

此外,我设置cell.contentView.opaque = NO的目的是为了在单元格的某些区域实现透明度(不幸的是,桌子背后的背景图像必须通过某些部分的每个单元格来显示以获得风格效果.我知道这是一个性能损失.它必须是所以).

问题:当我选择或突出显示(按下)时,我仍会看到在我的单元格后面(在透明区域中)绘制默认的漂亮蓝色渐变背景.这会遮挡桌子后面的图像,这很糟糕.

目标:为了防止蓝色渐变背景出现,但仍然能够从内部检查cell.isSelectedcell.isHighlighted属性-[MyContentView drawRect:]以确定如何绘制我自己的自定义选择/突出显示.

我尝试过的:

  1. 设置cell.selectionStyle = UITableViewCellSelectionStyleNone具有防止漂亮的蓝色渐变选择背景的所需效果,但也防止cell.isSelectedcell.isHighlighted属性被正确设置,这意味着我无法自己做自定义选择/高亮显示绘图

  2. 设置cell.selectionBackgroundView = nilcell.backgroundView = nil单元格-init-prepareForReuse方法中的设置不会阻止蓝色渐变选择背景

  3. 设置cell.selectionBackgroundView = nil-[MyContentView -drawRect:]方法确实具有防止蓝色梯度选择背景的所希望的效果,但是,似乎非常janky

  4. 覆盖 - [UITableViewCell setSelected:animated:]为无操作.这不具有防止蓝色渐变选择背景的期望效果

jes*_*rry 68

您还必须覆盖setHighlighted:以防止蓝色渐变显示.如果您只是覆盖setHighlighted:那么您最终会得到一个瞬间选择效果.

所以你将有这两种方法:

- (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];
}
Run Code Online (Sandbox Code Playgroud)

  • 这是迄今为止最好的答案.更多人需要对其进行投票. (6认同)

Mug*_*nth 61

cell.selectionStyle = UITableViewCellSelectionStyleNone;
Run Code Online (Sandbox Code Playgroud)

  • 我在寻找这个.谢谢! (2认同)

Jas*_*son 47

Matt Gallagher 在这篇文章中提供了一个关于定制UITableViews的优秀资源.你想要做的是将selectedBackgroundView设置为透明或UIImageView的新视图(而不是nil).

  • 为了进一步澄清这一点对于未来的读者,而不是设置任何cell.selectionStyle,将cell.selectedBackgroundView设置为UIView - 我将其设置为与我的单元格具有相同边界的UIView,然后将alpha设置为0.5以突出显示单元格但仍然保持一切可见.不要忘记在setSelected方法中调用[self setNeedsDisplay]! (9认同)