iOS - selectedBackgroundView中的自定义UITableViewCell子视图

时间:2012-09-25 00:57:28

标签: ios uitableview

我已经设置了一个带有多个标签和图片的自定义UITableViewCell,我(最终)让它看起来我希望它看起来如何。

然而,我似乎无法弄清楚如何让选择看起来我想要它看起来如何。我已经实现了setSelected方法,它允许我很好地改变背景颜色,但我真正喜欢的是将背景颜色设置为黑色并在其上显示彩色矩形所选单元格的左侧(10像素宽和单元格的高度)。

彩色框将以编程方式设置颜色,因此虽然我可以轻松地将selectedBackgroundView设置为UIImageView,但在这种情况下这不起作用。

选择单元格时,以下代码根本不会显示selectedViewColor UIView

- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
    UIView *selectedView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.selectedBackgroundView.bounds.size.width, self.selectedBackgroundView.bounds.size.height)];
    [selectedView setBackgroundColor:[UIColor blackColor]];

    UIView *selectedView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, self.selectedBackgroundView.bounds.size.height)];
    [selectedViewColor setBackgroundColor:[UIColor redColor]];
    [selectedView addSubview:selectedViewColor];

    self.selectedBackgroundView = selectedView;

    [super setSelected:selected animated:animated];
}

此代码看起来很基本,所以我认为在selectedBackgroundView中显示任何类型的子视图存在问题。

非常感谢任何替代方案或建议。

4 个答案:

答案 0 :(得分:4)

使用此代码可以做得更好。在setSelected方法中重新初始化两个视图是非常低效的。当您使用此代码选择它时,您实际上是在消隐单元格中的所有内容(我猜这不是您想要的)。最后,您将selectedBackgroundView视为选择单元格时显示的唯一视图(根据Apple的文档,它将显示在背景视图上)。

尝试以下(已编辑) - 将此代码放在创建单元格的位置(可能是cellForRowAtIndexPath:)

UIView* container = [[UIView alloc] initWithFrame:CGRectMake(0, 0, cell.backgroundView.bounds.size.width, cell.backgroundView.bounds.size.height)]; // we need this because in cells, the background views always take up the maximum width, regardless of their frames.
container.backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:0]; // make it transparent - we only want the square subview to be seen.
UIView *selectedViewColor = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, self.selectedBackgroundView.bounds.size.height)];
[selectedViewColor setBackgroundColor:[UIColor redColor]];
[container addSubview:selectedViewColor]
cell.selectedBackgroundView = container;

这将使您的红色方块在单元格中的其他视图上(并且仅在选定单元格时)显示。来自Apple的文档:

  

UITableViewCell仅在选择单元格时才将此属性的值添加为子视图。它将选定的背景视图添加为背景视图(backgroundView)正上方的子视图(如果它不是nil),或者在所有其他视图后面。

其次,在您的单元格中使用以下代码:

- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
   [super setSelected:selected animated:animated];
   if(selected == YES)
   {
      self.backgroundView.backgroundColor = [UIColor blackColor];
   }
   else
   {
      self.backgroundView.backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:0] // replace this with whatever's appropriate - a return to the unselected state.
   }
}

这将确保在选择单元格时背景变黑(不会干扰显示的内容。希望这些更改还可以解决您遇到的问题。

答案 1 :(得分:1)

除了上面的Xono回答,跟进他对上述答案的评论:

  

我在研究这个主题时遇到的一件事有可能是当选择一个单元格时,UITableViewCell背后的代码实际上可能会将所有子视图的backgroundColor设置为透明。

如果您的单元格的SelectionStyle不是None,它确实会这样做。并且它在setHighlighted的{​​{1}}和setSelected调用中执行此操作。

我的第一个解决方案是继承UITableViewCell并覆盖这两个方法,而不是调用基类方法并执行我自己的动画。这不是您现在重新实现(可能非常糟糕)标准iOS动画的理想选择。

进一步研究,标准方法为整个视图的不透明度设置动画,而不是子视图(它们仅设置子视图的颜色)。因此,最好的方法是仍然调用基类方法,然后只需将子视图颜色重新设置为它们应该是什么。即使你立即设置它们,因为它们的超级视图仍然是其不透明度的动画,它仍然会正确淡入淡出:

UITableViewCell

这是c#MonoTouch代码,但它同样适用于obj-c 请注意,在我的情况下,我总是有1个子视图,因此硬编码的0索引器。根据您的视图结构,这可能会有所不同。

答案 2 :(得分:0)

您可以为子视图覆盖方法“setBackgroundColor”,并添加具有相同功能的其他方法。在这种情况下,UITableCell将无法在选择后更改backgroundColor。

- (void)setBackgroundColor:(UIColor *)backgroundColor {
}

- (void)setColor:(UIColor *)color {
    [super setBackgroundColor:color];
}

答案 3 :(得分:0)

基于@Xono的回答,我解决了这个问题:

initWithStyle:reuseIdentifier:方法的内部,我添加了一个分隔符视图:

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        CGRect selectionViewFrame = self.contentView.bounds;
        UIView *selectionView = [[UIView alloc] initWithFrame:selectionViewFrame];
        [selectionView setBackgroundColor:[UIColor colorWithWhite:1. alpha:0.65]];
        self.selectedBackgroundView = selectionView;        
        self.vwSelectedSeparator = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.contentView.frame.size.width, 1.)];
        [self.vwSelectedSeparator setBackgroundColor:[UIColor colorWithHexString:@"aaa"]];
        [self.vwSelectedSeparator setAutoresizingMask:UIViewAutoresizingFlexibleWidth];
        [selectionView addSubview:self.vwSelectedSeparator];

        [self setAutoresizingMask:UIViewAutoresizingFlexibleWidth];
    }
    return self;
}

然后在setSelected:animated:方法中我添加了这些行:

- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
    [super setSelected:selected animated:animated];

    if (selected) {
        [self.vwSelectedSeparator setBackgroundColor:[UIColor colorWithHexString:@"aaa"]];
    }
}

对我来说就像ios6和ios7的魅力一样。我希望这会有所帮助。