最近在画界面上的时候遇到了这样一个问题,在点击cell的时候被隐藏(放在底层)的复选框会显示出来(正常状态下没有问题),很影响体验。然后就开始找到底是什么问题。
问题图:
Snip20180706_3.png
cell的代码:
self.btnCheck = [[UIButton alloc] init];
[self.btnCheck setImage:[UIImage svgImageNamed:@"ic_unselect" size:CGSizeMake(20, 20) tintColor:SVG_NORMAL_COLOR] forState:UIControlStateNormal];
[self.btnCheck setImage:[UIImage svgImageNamed:@"ic_selected" size:CGSizeMake(20, 20) tintColor:SVG_THEME_COLOR] forState:UIControlStateSelected];
[self addSubview:self.btnCheck];
//多选框布局
[self.btnCheck mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(self.mas_left).offset(15);
make.centerY.equalTo(self);
make.size.mas_equalTo(CGSizeMake(20, 20));
}];
//viewbackground布局
[self.viewBackground mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(self.mas_left).offset(15);
make.right.equalTo(self.mas_right).offset(-5);
make.top.equalTo(self.mas_top);
make.bottom.equalTo(self.mas_bottom);
}];
//长按操作
- (void) setSelectedMode:(BOOL) selected{
if (selected) {
[self.viewBackground mas_updateConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(self.mas_left).offset(35);
}];
}else{
[self.viewBackground mas_updateConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(self.mas_left).offset(0);
}];
}
}
经过修改背景色等测试和查阅资料,最终确定问题是因为当cell处于highlighted/selected状态时,默认会执行如下动作:
1:将其所有子视图的backgroundColor设置为清除颜色(透明)。
2:突出显示可以突出显示的所有子视图内容(就是强调内容),例如UIImageView。
可以通过这一句代码解决,但是这样的话会导致没有点击效果。
self.selectionStyle = UITableViewCellSelectionStyleNone;
然后就重新写了一下高亮的选择效果,就没有问题了。
- (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated {
[super setHighlighted:highlighted animated:animated];
if (highlighted) {
self.viewBackground.backgroundColor = UIColorFromHex(0xcccccc);
} else {
// 增加延迟消失动画效果
[UIView animateWithDuration:0.1 delay:0.1 options:UIViewAnimationOptionCurveEaseInOut animations:^{
self.viewBackground.backgroundColor = [UIColor whiteColor];
} completion:nil];
}
}
后来发现一个更加简单的方法,在cell中将btnCheck隐藏起来,在多选状态下将隐藏取消掉就可以了。
self.btnCheck.hidden = YES;
- (void) setSelectedMode:(BOOL) selected{
if (selected) {
self.btnCheck.hidden = NO;
[self.viewBackground mas_updateConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(self.mas_left).offset(35);
}];
}else{
self.btnCheck.hidden = YES;
[self.viewBackground mas_updateConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(self.mas_left).offset(0);
}];
}
}
参考文章: