当用户单击该单元格时,我希望创建一个阴影动画效果,在该单元格中,阴影将从0“增长”到预定的半径。
下面是代码的快照,但我无法将其动画化:
-(void) tableView:(UITableView *)tableView_ didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
[CATransaction begin]; {
[CATransaction setAnimationDuration:5];
cell.layer.shadowOpacity = 1.0;
cell.layer.shadowRadius = 20;
cell.layer.shadowColor = [UIColor blackColor].CGColor;
cell.layer.shadowOffset = CGSizeMake(0.0, 0.0);
}
[CATransaction commit];
[tableView_ deselectRowAtIndexPath:indexPath animated:YES];
}
-(void) tableView:(UITableView *)tableView_ didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
CABasicAnimation *animShadow = [CABasicAnimation animationWithKeyPath:@"shadowRadius"];
animShadow.fromValue = [NSNumber numberWithFloat:0.0];
animShadow.toValue = [NSNumber numberWithFloat:20];
animShadow.duration = 3.0;
[cell.layer addAnimation:animShadow forKey:@"shadowRadius"];
[tableView_ deselectRowAtIndexPath:indexPath animated:YES];
}
有什么建议吗?
发布于 2016-04-10 22:35:23
使用CABasicAnimation
动画代替,例如,为了只动画,shadowOpacity
u可以尝试下面的代码
-(void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
//animation shadowOpacity
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"shadowOpacity"];
animation.fromValue = [NSNumber numberWithFloat:0.0];
animation.toValue = [NSNumber numberWithFloat:1.0];
animation.duration = 1.0f;
[cell.layer addAnimation:animation forKey:@"shadowOpacityAnimation"];
[tableView deselectRowAtIndexPath:indexPath animated:YES];
cell.layer.shadowOpacity = 1.0f;
cell.layer.shadowRadius = 20.0f;
}
要动画化shadowOpacity
和shadowRadius
,您可以使用下面的代码
-(void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
//animation both the shadowOpacity and shadowRadius
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"shadowOpacity"];
animation.fromValue = [NSNumber numberWithFloat:0.0];
animation.toValue = [NSNumber numberWithFloat:1.0];
CABasicAnimation *shadowRadiusAnimation = [CABasicAnimation animationWithKeyPath:@"shadowRadius" ];
shadowRadiusAnimation.fromValue =[NSNumber numberWithFloat:0.0];
shadowRadiusAnimation.toValue = [NSNumber numberWithFloat:20.0];
CAAnimationGroup *group = [CAAnimationGroup animation];
group.animations = @[animation,shadowRadiusAnimation];
group.duration = 1.0f;
[cell.layer addAnimation:group forKey:@"shadowGroupAnimation"];
[tableView deselectRowAtIndexPath:indexPath animated:YES];
cell.layer.shadowOpacity = 1.0f;
cell.layer.shadowRadius = 20.0f;
}
要动画化只有shadowRadius
,您可以使用下面的代码
-(void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
//animation shadowRadius
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
CABasicAnimation *shadowRadiusAnimation = [CABasicAnimation animationWithKeyPath:@"shadowRadius" ];
shadowRadiusAnimation.fromValue =[NSNumber numberWithFloat:0.0];
shadowRadiusAnimation.toValue = [NSNumber numberWithFloat:20.0];
shadowRadiusAnimation.duration = 1.0f;
[cell.layer addAnimation:shadowRadiusAnimation forKey:@"shadowRadiusAnimation"];
[tableView deselectRowAtIndexPath:indexPath animated:YES];
cell.layer.shadowOpacity = 1.0f; //set final values
cell.layer.shadowRadius = 20.0f;
}
效果非常相似,没有太大的不同,
编辑在动画完成后推送视图控制器,可以设置动画委托,动画完成后调用。
例如,
-(void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
//animation both the shadowOpacity and shadowRadius
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"shadowOpacity"];
animation.fromValue = [NSNumber numberWithFloat:0.0];
animation.toValue = [NSNumber numberWithFloat:1.0];
CABasicAnimation *shadowRadiusAnimation = [CABasicAnimation animationWithKeyPath:@"shadowRadius" ];
shadowRadiusAnimation.fromValue =[NSNumber numberWithFloat:0.0];
shadowRadiusAnimation.toValue = [NSNumber numberWithFloat:20.0];
CAAnimationGroup *group = [CAAnimationGroup animation];
group.delegate = self; //this line set the delegate to self,
//if u use other option's also u can set the delegate for
//"CABasicAnimation" also just set it to self and implement the
// delegate method
group.animations = @[animation,shadowRadiusAnimation];
group.duration = 1.0f;
[cell.layer addAnimation:group forKey:@"shadowGroupAnimation"];
[tableView deselectRowAtIndexPath:indexPath animated:YES];
cell.layer.shadowOpacity = 1.0f;
cell.layer.shadowRadius = 20.0f;
}
//implement the delegate method this is called when animation stops with the flag,
- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag
{
if(flag)
{
SecondViewController *controller = [[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil];
[self.navigationController pushViewController:controller animated:YES];
}
}
https://stackoverflow.com/questions/36539307
复制相似问题