如果切换其他设置之一,则应禁用其他一些单元格.
为了使单元格处于正确状态,在viewWillAppear期间,我从NSUserDefaults读取设置,然后相应地更改单元格.
- (void) viewWillAppear:(BOOL)animated if ([[NSUserDefaults standardUserDefaults] boolForKey:@"OtherCellEnabled"]) { [self otherCell].alpha = 1.0; [self otherCell].userInteractionEnabled = YES; } else { NSLog(@"Changing alpha to 0.3"); [self otherCell].alpha = 0.3; [self otherCell].userInteractionEnabled = NO; }
问题在于,当我实际运行程序时,即使它在日志中表示alpha已更改,但alpha实际上并未更改. userInteractionEnabled确实似乎坚持,但alpha保持为1.0.
这不是细胞重用的问题,或者细胞没有及时实例化,因为其他设置可以很好地改变.
将它从cell.alpha更改为cell.contentView.alpha可以正常工作,但这是一个不同的设置.
看起来所有的设置都“坚持”,除了alpha设置,它以某种方式被覆盖.
解决方法
首先,我尝试将alpha更改放在cellForRowAtIndexPath中,但这也无效.经过大量的修补,我得出结论,UITableViewCell的alpha设置在某种程度上是特别的,因为它不断被覆盖或设置为1.0.
我发现了两个修复:
首先,不要在cellForRowAtIndexPath中进行更改,而是在UITableViewDelegate方法中使用willdisplayCell.无论出于何种原因,在这种方法中更改单元格的alpha实际上会坚持下去.当然,如果你这样做,你必须重新安排你的逻辑,以便在逐个单元的基础上完成更改,即:
- (void)tableView:(UITableView *)tableView willdisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { if (cell == [self otherCell]) { if ([[NSUserDefaults standardUserDefaults] boolForKey:@"OtherCellEnabled"]) { cell.alpha = 1.0; cell.userInteractionEnabled = YES; } else { NSLog(@"Changing alpha to 0.3"); cell.alpha = 0.3; cell.userInteractionEnabled = NO; } } }
正如我所说的,我不确定为什么这在willdisplayCell中有效但在cellForRowAtIndexPath中没有.其他人似乎也不确定:
What is -[UITableViewDelegate willDisplayCell:forRowAtIndexPath:] for?
UITableView background with alpha color causing problem with UITableViewCell
另一个解决方案是,使用另一个将实现相同效果的设置,而不是使用有问题的alpha.就我而言,那就是contentView.alpha和backgroundColor.无论出于何种原因,这些设置都会粘住,您甚至可以在viewWillAppear中设置它们,它将按预期工作:
- (void) viewWillAppear:(BOOL)animated { if ([[NSUserDefaults standardUserDefaults] boolForKey:@"OtherCellEnabled"]) { [self otherCell].backgroundColor = [UIColor colorWithRed:1.0 green:1.0 blue:1.0 alpha:1.0]; [self otherCell].contentView.alpha = 1.0; [self otherCell].userInteractionEnabled = YES; } else { NSLog(@"Changing alpha to 0.3"); [self otherCell].backgroundColor = [UIColor colorWithRed:1.0 green:1.0 blue:1.0 alpha:0.3]; [self otherCell].contentView.alpha = 0.3; [self otherCell].userInteractionEnabled = NO; } }
第二种方法的缺点是,现在您正在覆盖Storyboard的单元格颜色设置,但如果您关心它,可以通过询问故事板的颜色来解决这个问题.
我不确定为什么cell.alpha被区别对待.也许是关于静态单元的实现方式.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。