向后面发送集合视图单元格的子视图会阻止它更改backgroundColor

时间:2015-10-02 22:03:32

标签: ios uiview uicollectionview background-color uicollectionviewcell

我有一个自定义UICollectionViewCell,我正在为其contentView添加一个子视图,以便其删除按钮看起来像是悬停在单元格的角落,但稍微超出界限(Just比如跳板中应用程序的删除按钮)。一切正常,但是当我在突出显示或选择单元格后尝试更改此子视图insetView.backgroundColor时,它不会改变。

UICollectionViewCell

- (void) layoutSubviews
{
    [super layoutSubviews];

    self.insetView = [[UIView alloc] initWithFrame:CGRectInset(self.bounds, self.bounds.size.width/64, self.bounds.size.height/16)];
    self.insetView.layer.cornerRadius = 6;
    self.insetView.layer.masksToBounds = YES;
    self.insetView.backgroundColor = [UIColor colorWithRed:65/255.0 green:166/255.0 blue:42/255.0 alpha:1];
    [self.contentView addSubview:self.insetView];
    [self.contentView sendSubviewToBack:self.insetView];
    self.backgroundColor = [UIColor blackColor];
}

CollectionViewController

- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
{
    JamCollectionViewCell *cell = (JamCollectionViewCell*)[collectionView cellForItemAtIndexPath:indexPath];
    UIView *v = [[cell.contentView subviews] firstObject];
    v.backgroundColor = [UIColor lightGrayColor];
}

我也试过

- (void)collectionView:(UICollectionView *)collectionView didHighlightItemAtIndexPath:(NSIndexPath *)indexPath
{
  JamCollectionViewCell *cell = (JamCollectionViewCell*)[collectionView cellForItemAtIndexPath:indexPath];   
  cell.insetView.backgroundColor = [UIColor lightGrayColor];
}

尝试了所有组合我。即尝试按顺序获取子视图并更改didHighlightItemAtIndexPath中的背景颜色并尝试通过其属性名称cell.insetView获取子视图并更改didSelectItemAtIndexPath中的背景颜色但没有任何效果

有趣的是,如果子视图cell.insetView 发送到cell.contentView的后面,响应更改背景颜色无论何方何地。因此问题标题。

很抱歉这个问题很长,谢谢你的帮助。

1 个答案:

答案 0 :(得分:2)

UICollectionViewUICollectionViewCell已为selecthighlight内置状态管理,但没有明确的响应。您可以尝试将此逻辑移动到UICollectionViewCell子类中,您可能会发现运气更好。

如果您要从NIB或故事板加载代码,则可以覆盖awakeFromNib以创建自定义背景视图(或将其添加到故事板中并通过IBOutlet将其连接到单元格) 。否则,无论在何处创建其他视图,都要添加它。

然后,您可以在自定义子类中覆盖setSelected:setHighlighted:(记得调用super),以根据当前状态调整颜色。我已经多次这样做作为选择状态的实现,并且它继续在iOS 9中工作。

适用于海报的代码:

(void)setSelected:(BOOL)selected {
    [super setSelected:selected];
    if (selected) {
        self.insetView.backgroundColor = [UIColor lightGrayColor];
    }
    else {
        self.insetView.backgroundColor = [UIColor colorWithRed:65/255.0 green:166/255.0 blue:42/255.0 alpha:1];
    }
}