我尝试通过在我的tableview单元格中添加CGGradientLayer来稍微修改我的应用程序,并且代码运行良好。
现在唯一的问题是,每当我选择一个tableview单元格时,它都不会改变颜色到选择样式,无论是蓝色还是灰色。
我用于渐变的代码是
UIView *view = [[UIView alloc] initWithFrame:cell.frame];
CAGradientLayer *gradient = [CAGradientLayer layer];
gradient.frame = view.bounds;
gradient.colors = [NSArray arrayWithObjects:(id)[[UIColor colorWithRed:0.3 green:0.3 blue:0.3 alpha:1.0] CGColor], (id)[[UIColor colorWithRed:0.28 green:0.28 blue:0.28 alpha:1.0] CGColor], nil];
[cell.layer insertSublayer:gradient atIndex:0];
我知道我的单元格正在被选中,因为我的单元格中的文本会将颜色更改为白色,这是默认的选择颜色。
所以我想解决的是我的细胞上的选择颜色。我不介意我是否不能使用所提供的选择颜色,但在这种情况下,我可以在选择时在单元格上添加我自己的透明矩形吗?
答案 0 :(得分:2)
当选择UITableViewCell时,它会在索引0处插入选择背景。最终会在渐变之下。视图层次结构如下所示:
<MyTableViewCell: 0xd26fb80; baseClass = UITableViewCell; frame = (0 44; 320 44); autoresize = W; layer = <CALayer: 0xd26fc90>>
| <UITableViewCellSelectedBackground: 0x6880810; frame = (0 0; 320 43); layer = <CALayer: 0x68855c0>>
| <CAGradientLayer: 0xd26ecb0> (layer)
| <UITableViewCellContentView: 0xd26fcc0; frame = (0 0; 320 43); opaque = NO; layer = <CALayer: 0xd26fd00>>
| <UIView: 0xd26e8e0; frame = (0 43; 320 1); autoresize = W+TM; layer = <CALayer: 0xd26f1a0>>
请注意,我在创建单元格时在索引零处插入的CAGradientLayer
位于UITableViewCellSelectedBackground
之后,因此渐变图层可视地覆盖选定的背景图层。
要修复它,请创建自己的UITableViewCell
子类。使渐变图层成为子类的属性或ivar:
@implementation MyTableViewCell
{
CAGradientLayer *_gradient;
}
- (void)initGradient
{
_gradient = [CAGradientLayer layer];
_gradient.opaque = YES;
_gradient.frame = self.bounds;
_gradient.colors = [NSArray arrayWithObjects:(__bridge id)[UIColor redColor].CGColor, (__bridge id)[UIColor blueColor].CGColor, nil];
[self.layer insertSublayer:_gradient atIndex:0];
}
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
if ((self = [super initWithStyle:style reuseIdentifier:reuseIdentifier])) {
[self initGradient];
}
return self;
}
- (void)awakeFromNib
{
[self initGradient];
}
根据是否选择了单元格,覆盖子类中的setSelected:animated:
以显示或隐藏渐变图层:
- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
[super setSelected:selected animated:animated];
_gradient.hidden = selected;
}
答案 1 :(得分:0)
我遇到了同样的问题,因为并不总是调用- (void)setSelected:animated:
(例如当用户按住单元格时等),我发现这种方法更好用。
基本上,只需将渐变放在cell.backgroundView
。
UIView *cellBackgroundView = [[UIView alloc] initWithFrame:cell.bounds];
CAGradientLayer *gradient = [CAGradientLayer layer];
gradient.frame = cellBackgroundView.bounds;
gradient.colors = [NSArray arrayWithObjects:(id)[[UIColor colorWithRed:0.3 green:0.3 blue:0.3 alpha:1.0] CGColor], (id)[[UIColor colorWithRed:0.28 green:0.28 blue:0.28 alpha:1.0] CGColor], nil];
[cellBackgroundView.layer addSublayer:gradient];
cell.backgroundView = cellBackgroundView;
然后根据需要设置selectedBackgroundView
。这样,单元格的backgroundView肯定会被完全隐藏,层和所有。这也适用于子类化,将cell.
替换为self.
。