我正在回答我自己的问题,因为我能够解决它。
首先,我尝试将 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
. 其他人似乎也不确定:
-[UITableViewDelegate willDisplayCell:forRowAtIndexPath:] 是什么?
带有 alpha 颜色的 UITableView 背景导致 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 的单元格颜色设置,但是如果您关心的话,您可以通过询问 Storyboard 的颜色来解决这个问题。
我不确定为什么cell.alpha
会受到不同的对待。也许与静态单元的实现方式有关。