2013-05-12 3 views
4

Я пытаюсь отобразить анимированный UIImage в imageView UITableViewCell. Анимационное изображение отображается после первого присваивания, но не при каждой последующей попытке.UIImageView в UITableViewCell не анимируется, когда анимированный 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) 
+0

Проверьте эту тему http://stackoverflow.com/questions/4001043/why-does-my-animation-in-my-cell-disappear-when-the-cell-is-selected/33021637#33021637 Это помогло мне с аналогичной проблемой. –

+0

Я отправил ответ здесь. Plz check: http://stackoverflow.com/a/34741997/4720315 –

ответ

1

Я настоятельно рекомендую вам не делать каких-либо анимации к изображениям в cellForRowAtIndexPath, потому что, если у вас больше изображений, при быстрой прокрутке появляется нежелательный эффект (изображения ячеек будут переключаться из-за удобства использования ячеек).

То, что я сделал в одном из моих проектов, я реализовал метод – scrollViewDidScroll: для UITableViewDelegate (что соответствует UIScrollViewDelegate), и там я назвал метод, который будет анимировать изображения только на видимых ячейках (tableView.visibleCells).

С другой стороны, я не понимаю, почему вы используете static BOOL second = NO;, вы можете просто проверить, нет ли cell.imageView.image == nil или нет.

Также проверьте код анимации, возможно, что что-то не работает должным образом (помните, что ячейки повторно используются) .

+0

'- scrollViewDidScroll:' вызывается каждый раз, когда tableView прокручивает всего несколько пикселей. Возможно, вы имели в виду '- scrollViewDidEndDecelerating:'? Я не мог проверить для '(cell.imageView.image == nil)' потому что '[tableView dequeueReusableCellWithIdentifier: CellIdentifier forIndexPath: indexPath];' не всегда возвращает тот же UITableViewCell. – Pipo

+0

Это нормально в '-scrollViewDidScroll' для проверки видимых ячеек, потому что если вы уже сделали правильные изменения, изображения больше не будут меняться. Вы также можете изменить его в '-scrollViewDidEndDecelrating:', но поведение будет не таким классным, как если бы вы сделали это в '-scrollViewDidScroll' – danypata

+0

Но' - scrollViewDidScroll: 'не вызывается после' - tableView: didSelectRowAtIndexPath: '. И поэтому изображение не будет анимировано, если пользователь не прокрутит. После тестирования немного дальше, я уверен, что проблема связана с анимацией UITableViewCell, которая показана перед вызовом '- tableView: didSelectRowAtIndexPath:'. Я думаю, что UIActivityIndicatorView работает, но не является UIAnimatedImage. – Pipo

Смежные вопросы