【问题标题】:UITableViewCell: How to prevent blue selection background w/o borking isSelected property?UITableViewCell:如何防止蓝色选择​​背景不带 isSelected 属性?
【发布时间】:2012-12-05 18:06:02
【问题描述】:

我有一个自定义的UITableViewCell 子类。我已将单元格子类的 contentView 设置为 一个自定义的UIView 类,我在其中覆盖-drawRect: 并在那里完成所有绘图。

另外,我设置cell.contentView.opaque = NO 是为了在单元格的某些区域实现透明度(不幸的是,表格后面的背景图像必须通过某些部分的每个单元格显示以达到风格效果。我知道这是一个性能下降。一定是这样)。

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

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

我尝试过的:

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

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

  3. -[MyContentView -drawRect:] 方法中设置cell.selectionBackgroundView = nil确实具有防止蓝色渐变选择背景的预期效果,但这看起来很笨拙

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

【问题讨论】:

    标签: iphone objective-c cocoa-touch uikit


    【解决方案1】:

    您还必须覆盖 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];
    }
    

    【讨论】:

    • 这是迄今为止最好的答案。需要更多人支持它。
    • @sam 同意。此方法仅在您有 UITableViewCell 子类(原始问题提到)时才有效,并且在我看来是更好的解决方案。
    • 我必须取消注释 [super setSelected:selected animated:animated] 才能使 isSelected 属性正常工作。
    【解决方案2】:
    cell.selectionStyle = UITableViewCellSelectionStyleNone;
    

    【讨论】:

    • 我在找这个。谢谢!
    【解决方案3】:

    自定义 UITableViews 的优秀资源是 Matt Gallagher 的 this post。您要做的是将 selectedBackgroundView 设置为透明或 UIImageView 的新视图(而不是 nil)。

    【讨论】:

    • 杰森,谢谢!你的建议成功了。几点说明:-我不确定您是如何从文章中收集到这些信息的,因为这不是重要的观点之一。但干得好:) - 那篇文章内容非常丰富。不幸的是,它似乎也有点误导,因为它忽略了您需要更多单元格自定义的常见情况,在这种情况下,最好继承并覆盖 contentView 的 -drawRect: 以实现快速滚动,如下所述:blog.atebits.com/2008/12/…
    • 只是为了让未来的读者进一步澄清这一点,而不是设置任何 cell.selectionStyle,而是将 cell.selectedBackgroundView 设置为 UIView - 我将其设置为与我的单元格具有相同边界的 UIView,然后设置alpha 到 0.5 以突出显示单元格,但仍使所有内容可见。不要忘记在 setSelected 方法中调用 [self setNeedsDisplay]!
    • @KendallHelmstetterGelner 使用此方法的所有内容都有效,除了尽管将 alpha 设置为 0.5 并调用 setNeedsDisplay,选择的背景颜色是完全白色的,并且在选择时会覆盖单元格的视图(尽管设置了 @ 987654325@/selectedBackgroundView的背景颜色为clearColor)。有什么想法吗?
    【解决方案4】:

    到目前为止,更简单的方法 - 在我看来 - 是通过在界面生成器屏幕中设置表格视图属性复选框,其中显示“触摸时显示选择”。请看下面的截图:

    【讨论】:

    【解决方案5】:

    过去对我有用的只是投入:

    - (void)setSelected:(BOOL)selected animated:(BOOL)animated { }
    

    在我的 UITableViewCell 子类中(因为它不会调用 super 并使自己突出显示)。 希望这就是您想要的。

    【讨论】:

    • thx joe,但我已经尝试过了,它不会阻止蓝色渐变选择背景
    • 我在上面编辑了我的 Q 以包括我尝试过这个但它没有达到预期的效果
    【解决方案6】:

    这个怎么样?

    // disable user interaction
    cell.userInteractionEnabled = NO;
    

    【讨论】:

      猜你喜欢
      • 2017-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-24
      • 1970-01-01
      • 1970-01-01
      • 2016-10-04
      相关资源
      最近更新 更多