5

我正在尝试在 UITableViewCell 的 imageView 中显示动画 UIImage。动画图像在第一次分配后显示,但不是每次进一步尝试。

下面是 TableViewController 的代码:

#import "ViewController.h"

@interface ViewController ()
@property (nonatomic, strong) UIImage *animatedImage;
@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.animatedImage = [UIImage animatedImageNamed:@"syncing" duration:1.0];
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return 1;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static BOOL second = NO;

    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

    if (second) {

        cell.imageView.image = nil;
        NSLog(@"Removed image");
    }
    else {

        cell.imageView.image = self.animatedImage;
        NSLog(@"Added image");

        if (![cell.imageView isAnimating]) {

            [cell.imageView startAnimating];
            NSLog(@"Started animation for UIImageView: %@", cell.imageView);
        }
    }

    second = !second;

    return cell;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    [self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
}

@end

这是我两次点击单元格时的输出:

Added image
Started animation for UIImageView: <UIImageView: 0x7197540; frame = (0 0; 0 0); opaque = NO; userInteractionEnabled = NO; animations = { UIImageAnimation=<CAKeyframeAnimation: 0x715bc80>; }; layer = <CALayer: 0x71975a0>> - (null)
Removed image
Added image
Started animation for UIImageView: <UIImageView: 0x7197540; frame = (6 6; 30 30); opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x71975a0>> - (null)
4

1 回答 1

1

I strongly suggest that you don't do any animation to the images in cellForRowAtIndexPath because if you have more images then an undesired effect will appear when you fast scroll (the cell images will switch due to cell re usability).

What I did in one of my projects, I implemented the – scrollViewDidScroll: method for the UITableViewDelegate (which conforms to UIScrollViewDelegate) and there I called a method that will animate the images only on the visible cells (tableView.visibleCells).

On the other hand I don't see why you are using the static BOOL second = NO; you could simply check if cell.imageView.image == nil or not.

Also check your animation code, it is possible that something is not working properly there (keep in mind that the cells are reused) .

于 2013-05-12T17:31:03.747 回答