【问题标题】:Customizing properties of subclassed UITableViewCell when selected选择时自定义子类 UITableViewCell 的属性
【发布时间】:2013-03-09 13:45:13
【问题描述】:

当子类化 tableview 单元格进入选定状态时,我无法自定义其外观和行为。

我的单元格有三个标签,我在 initWithStyle: 方法中添加到它的内容视图中,如下所示:

cell1Label = [[UILabel alloc] initWithFrame:
    CGRectMake(75.0f, 12.0f, 67.0f, 12.0f)];
cell1Label.backgroundColor = [UIColor clearColor];
cell1Label.textColor = [UIColor blackColor];
cell1Label.shadowColor = [UIColor whiteColor];

   blah, blah, blah...

[self.contentView addSubview:cell1Label];

然后,我在子类中的 setSelected:(BOOL)selected animated:(BOOL)animated 方法的背景上放置了一个黑色叠加层:

UIView *backgroundView = [[UIView alloc] initWithFrame:
    CGRectMake(0.0f, 0.0f, 150.0f, 70.0f)];
backgroundView.backgroundColor = [UIColor colorWithRed:
0.0 green:0.0 blue:0.0 alpha:0.4];
self.selectedBackgroundView = backgroundView;

问题从这里开始。因为我想在选择单元格时保持我的UILabel 可读,所以我需要更改它们的textColorshadowColor。但是,我似乎找不到这样做的好地方。

如果我将代码放在 setSelected:(BOOL)selected animated:(BOOL)animated 中,则不会发生任何事情;我似乎只能对 selectedBackgroundView 进行更改。

我也尝试使用 didSelectRowAtIndexPath:didDeselectRowAtIndexPath: TableView 委托方法,例如:

CustomDataCell* selectedCell = (CustomDataCell*)[tableView 
    cellForRowAtIndexPath:indexPath];
selectedCell.cell1Label.shadowColor = [UIColor lightGrayColor];
selectedCell.cell1Label.textColor = [UIColor blackColor];

但是,当单元格离开可见区域时,此方法会出现一些问题。也就是说,如果我选择了一个单元格,那么它会离开可见区域,当我选择另一个单元格时,它的文本属性不会变回它们的正常状态。黑色背景应该会消失,但我分配给所选状态的新 textColorshadowColor 仍然存在。

处理子类UITableViewCells 的选定(可能还有其他)状态的最佳最可靠方法是什么?

我正在使用ARC;永远不要使用IB;在Xcode 4.6iOS 6.1 SDK 上。

【问题讨论】:

    标签: iphone ios uitableview customization


    【解决方案1】:

    使用UITableViewCellsetHighlighted:animated 方法更改您的标签color

    - (void)setSelected:(BOOL)selected animated:(BOOL)animated
    {
        [super setSelected:selected animated:animated];
    
        // Change you label text color here
        //
        // Edit Here
    
        if (selected) {
            // New Colors Here
        }
        else {
            // Old Colors Here
        }
    }
    

    【讨论】:

    • 不幸的是它没有用。出于某种原因,此方法将我所有的 text- 和 shadowColors 设置为正常状态。
    • 我更新了我的答案。查看一些代码,我还覆盖了 setSelected:animated: 类似的更改为标签颜色。
    • 这不起作用,因为 selected 与突出显示的不同(if 语句的突出显示部分实际上从未被调用)。但是通过在 setSelected:(BOOL)selected 方法中应用相同的逻辑,代码可以工作。如果您可以更新您的代码以反映正确的方式,我会将您标记为最佳答案。
    • 您是否知道为什么当单元格离开可见区域然后重新进入时,选定的文本属性会恢复正常,但不知道我为 selectedBackgroundView 设置的背景?
    • 不确定。我暂时无法尝试。您可以获取当前选定的单元格,[table indexPathForSelectedRow],并根据需要配置您的单元格。
    【解决方案2】:

    当一个单元格被选中时,它会将其所有标签(包括您自己添加的标签)设置为突出显示状态。这意味着您可以在初始化时定义突出显示的文本颜色,并让单元格处理它。

    可能此时标签被设置为突出显示,这会撤消您自己进行的任何颜色更改。

    另外,一个单元格有一个 selectedBackgroundView 属性,您应该使用它而不是添加一个新的子视图。

    【讨论】:

    • 这适用于文本颜色,但阴影颜色没有高亮状态。
    • 没错,您必须在 setSelected 中设置它们 - 我在解释为​​什么您尝试更改颜色不起作用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-08
    • 1970-01-01
    • 2012-10-27
    • 2014-12-27
    • 1970-01-01
    • 2014-10-15
    • 1970-01-01
    相关资源
    最近更新 更多