覆盖在xib中设置的CALayer的不透明度

时间:2013-07-06 19:02:01

标签: ios

我正在尝试在UIView淡入时UITableViewCell选中。在xib文件中,我将视图的opacity设置为YES,将alpha设置为0.4

cellForRowAtIndexPath,(我也尝试将其放入didSelectRowAtIndexPath)我有:

CABasicAnimation* fadeAnim = [CABasicAnimation animationWithKeyPath:@"opacity"];
fadeAnim.fromValue = [NSNumber numberWithFloat:1.0];
fadeAnim.toValue = [NSNumber numberWithFloat:0.0];
fadeAnim.duration = 1.0;
[cell.shade.layer addAnimation:fadeAnim forKey:@"opacity"];

当单元格出现在屏幕上时,它变为黑色(不透明1.0),淡化为0.0,然后跳转到0.4。我只希望在点击时更改单元格的不透明度。

didSelectRowAtIndexPath中,我有:

if (cell.shade.layer.opacity > 0.5) {
    [cell.shade.layer setOpacity:0.0];
} else {
    [cell.shade.layer setOpacity:1.0]; 
} 

当我在didSelectRowAtIndexPath的第一行打破时,当我运行po cell.shade.layer.opacity时,LLVM告诉我它是0.4。运行[cell.shade.layer setOpacity:1.0]后,它仍然是0.4。是什么阻止了xib alpha属性被覆盖?

我也尝试过:

[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.5];
[UIView setAnimationDelay:1.0];
[UIView setAnimationCurve:UIViewAnimationCurveEaseOut];

if (cell.shade.alpha > 0.5) {
    [cell.shade setAlpha:0.0];
} else {
    [cell.shade setAlpha:1.0];
}

[UIView commitAnimations];

但结果是一样的。

我不想将动画放在setSelected:中,因为将代码放入'setSelected or didSelect should be the same, and I want the new view to stay visible after it's selected, so conceptually it makes sense to put the code in didSelect`的结果。

1 个答案:

答案 0 :(得分:0)

如果您只需要在选择和突出显示期间需要动画,请删除-cellForRowAtIndexPath中的动画,因为当tableview需要一个单元格而不显示时会调用该动画。子类为Dinesh说UITableViewCellClass并覆盖-setSelected: setHighlighted:
除非你真的需要,否则不要使用图层(并且它会在不到20%的情况下发生),UIView类拥有使用简单动画块执行此类动画所需的一切,图层引入了关于modalLayer的更多概念和presentationLayer动画。
注意添加视图的位置,UITableViewCell使用-contentView作为子视图的容器 如果你想知道UITableView何时显示/选择/解除一个单元格,请使用UITableViewDelegateProtocol它有很多你应该看的方法。
只提一些:

– tableView:willDisplayCell:forRowAtIndexPath:
– tableView:willSelectRowAtIndexPath:
– tableView:didEndDisplayingCell:forRowAtIndexPath:

希望这有帮助。
Ciao的,
安德烈