2010-10-20 64 views
3

我有一个UITableViewCell子类,它在drawRect:方法中进行绘制。整个矩形都是自定义绘制的,包括背景。 我能够在保持滚动非常平滑的同时获得非常复杂的单元格。定制UITableViewCell和setSelected动画:动画:

我的问题:每当出现视图时,我都会拨打[table deselectRowAtIndexPath:path animated:YES];,以符合Apple的HIG。但是,不会发生动画。当我有一个透明的自定义视图(用子视图创建)时它工作正常,所以当然会出现苹果的背景。现在它不。

我的drawRect:在“动画时间”中调用一次,大约一半。我认为这是因为它将单元格的突出显示的属性从1设置为0,当它降到0.5以下时,它会捕捉到0。

如何为此过渡设置动画?我的猜测是使用通常的beginAnimations:等等,并将我的单元格对象中的自定义浮点字段从1改为0。这是否会将drawRect:重复设置为动画?

更新 我设法让这几乎工作。我已经覆盖setSelected:animated:如下所示:

- (void) setSelected:(BOOL)selected animated:(BOOL)animated { 
    [super setSelected:selected animated:NO]; 

    if (animated) { 
     [CATransaction begin]; 
     CATransition* animation = [CATransition animation]; 
     animation.type = kCATransitionFade; 
     animation.duration = 0.6; 
     [animation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]]; 
     [view.layer addAnimation:animation forKey:@"deselectRow"]; 
     [CATransaction commit]; 
    } 
} 

如果桌面视图在屏幕上,这个效果很好。但是,如果我从导航(后退)返回到表格视图,而不是从选中淡入到未选中状态,则它会从不可见状态变为未选状态。什么会导致这种情况?

+0

那么,如何你的执行'的setSelected:动画:'你'UITableViewCell'子看? – 2010-10-20 23:06:28

+0

我的问题基本上是如何编码::) – mips 2010-10-20 23:07:01

+0

您需要重写该方法,以避免调用在超类上定义的代码,并创建自己的动画。如果您不知道如何为Google制作动画,请执行此操作。 – vfn 2010-10-21 03:10:26

回答

7

有点迟到的答案,但可能对你和其他人有用。你需要做的,是短信超级之前,您的自定义选择的视图分配,像这样:

- (void)setSelected:(BOOL)selected animated:(BOOL)animated { 
    UIView *view = [[UIView alloc] initWithFrame:self.frame]; 
    view.backgroundColor = [UIColor colorWithRed:.9 green:.0 blue:.125 alpha:1.0]; 

    self.selectedBackgroundView = view; 

    [super setSelected:selected animated:animated]; 
} 
+0

我使用了UIImageView和自定义选择渐变。这是有点假,但看起来很完美。谢谢! – steipete 2011-02-27 11:45:12

+6

您应该在创建时设置单元格的selectedBackgroundView,而不是setSelected:animated:方法;这将导致它不必要地被重复设置。 – titaniumdecoy 2012-01-14 21:30:30