将 collection 视图单元格的子视图发送到后面会阻止它更改 backgroundColor
Sending a subview of a collection view cell to the back stops it from changing backgroundColor
我有一个自定义 UICollectionViewCell
,我正在向它的 contentView
添加一个子视图,这样它的删除按钮看起来像是悬停在单元格的一角,但有点超出范围(就像跳板中应用程序的删除按钮一样)。一切正常,但是当我尝试更改此子视图时 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];
}
并尝试了我所有的组合。 e.尝试按顺序获取子视图并在 didHighlightItemAtIndexPath
中更改其背景颜色并尝试按其 属性 名称 cell.insetView
获取子视图并在 didSelectItemAtIndexPath
中更改其背景颜色] 但没有任何效果。
有趣的是,如果子视图 cell.insetView
NOT 发送到 cell.contentView
的后面,它 会 以两种方式和任何地方响应改变背景颜色。因此问题标题。
抱歉问题很长,感谢您的帮助。
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];
}
}
我有一个自定义 UICollectionViewCell
,我正在向它的 contentView
添加一个子视图,这样它的删除按钮看起来像是悬停在单元格的一角,但有点超出范围(就像跳板中应用程序的删除按钮一样)。一切正常,但是当我尝试更改此子视图时 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];
}
并尝试了我所有的组合。 e.尝试按顺序获取子视图并在 didHighlightItemAtIndexPath
中更改其背景颜色并尝试按其 属性 名称 cell.insetView
获取子视图并在 didSelectItemAtIndexPath
中更改其背景颜色] 但没有任何效果。
有趣的是,如果子视图 cell.insetView
NOT 发送到 cell.contentView
的后面,它 会 以两种方式和任何地方响应改变背景颜色。因此问题标题。
抱歉问题很长,感谢您的帮助。
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];
}
}