我有一个自定义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
的后面,会响应更改背景颜色无论何方何地。因此问题标题。
很抱歉这个问题很长,谢谢你的帮助。
答案 0 :(得分:2)
UICollectionView
和UICollectionViewCell
已为select
和highlight
内置状态管理,但没有明确的响应。您可以尝试将此逻辑移动到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];
}
}