如何在iOS SDK中禁用UIView/UIViewController的"突出显示子视图"消息?

Jac*_*ard 11 highlight background-color uiview ios subviews

我想在UITableViewCell点击它时使用默认突出显示.但是,我不希望自定义子视图(及其子视图)接收消息以更新其突出显示的状态,从而破坏backgroundColor属性.

编辑
"子视图"我指的是任何子UIView类,而不仅仅是UITableViewCells.

也许这种假设的情况会更好地表达我正在寻找的东西:我有一个UITableViewCell.叫它c.然后我添加一个UIView(称之为v)作为c的子视图.当我点击c时,我想要c突出显示(标准蓝色背景,白色字体颜色),但我不希望v突出显示.我该如何实现这一目标?

Den*_*cik 6

首先,UITableView会限制所有子视图,并向它们发送突出显示的消息.

因此,即使您在视图中放置了UILabel,无论它有多深,它都会遍历所有视图(通过使用子视图属性).

一个解决方案可以是(即IOS4 +),覆盖子视图属性,以及欺骗tableview的高亮函数,我们没有任何子视图.要做到这一点,我们需要确定调用者,如果是tableview的高亮显示方法,我们应该根本不返回任何子视图.

我们可以创建一个简单的UIView子类并覆盖下面的子视图.

- (NSArray *)subviews{
    NSString* backtrace = [NSString stringWithFormat: @"%@",[NSThread callStackSymbols]];
    if ([backtrace rangeOfString:@"_updateHighlightColorsForView"].location!=NSNotFound)
        return [super subviews];   

    return [[NSArray new] autorelease];
}
Run Code Online (Sandbox Code Playgroud)
  • 在IOS4 +之后可以使用callStackSymbols
  • _updateHighlightColorsForView是UITableView的方法,负责突出显示所有子节点

  • 不要做这个答案描述的内容.在创建UITableViewCell时,只需将selectionStyle设置为UITableViewCellSelectionStyleNone.你必须做自己的选择样式,但这应该是非常简单的,只需覆盖你的UITableViewCell子类上的setSelected并调整子视图选择状态. (4认同)
  • 哇,这太疯狂了.我不知道你能做到这一点.听起来太讨厌了. (2认同)

alb*_*ein 6

我有一个继承自的类UITableViewCell,所以我修复它覆盖setSelected:animated这样:

   - (void)setSelected:(BOOL)selected animated:(BOOL)animated
   {
       [super setSelected:selected animated:animated]; 
       //Reset highlighted status to all the childs that i care for.
       [self.someChild setHighlighted:NO];
       [self.someOtherChild setHighlighted:NO];
   }
Run Code Online (Sandbox Code Playgroud)