2015-02-19 2 views
1

У меня есть горизонтальный UICollectionView с n количество записей. Каждая ячейка имеет UIImageView, которая должна анимировать Fadein Fadeout с помощью некоторого TimerInterval. Таким образом, я планировал осуществить это перезагрузить мою UICollectionView с помощью NSTimer Моего фрагмента кода,UIImageView fade animation with UICollectionView

.... 
.... 
if (collectionTimer) { 
    [collectionTimer invalidate]; 
    collectionTimer = nil; 
} 
collectionTimer = [NSTimer scheduledTimerWithTimeInterval:5.0 target:self selector:@selector(reloadCollection) userInfo:nil repeats:YES]; 
.... 
.... 

reloadCollection Метода

-(void)reloadCollection{ 
    [_collectionView reloadData]; 
} 

cellForItemAtIndexPath Метод

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { 
    .... 
    .... 
    /* Basic Animation working fine*/ 
    [UIView animateKeyframesWithDuration:1.0 delay:1.0 options:UIViewKeyframeAnimationOptionAutoreverse animations:^{ 
     cell.articleImage.image = [UIImage imageNamed:[NSString stringWithFormat:@"%@.jpg", [images objectAtIndex:i]]]; 
    } completion:nil]; 

    /* Not working */ 
    /* [UIView transitionWithView:cell.articleImage duration:1.0f options:UIViewAnimationOptionTransitionCrossDissolve animations:^{ 
     cell.articleImage.image = [UIImage imageNamed:[NSString stringWithFormat:@"%@.jpg", [images objectAtIndex:i]]]; 
    } completion:nil]; */ 
    .... 
    .... 
} 

Основных анимационных работ хорошо. Но, когда я пытаюсь реализовать UIViewAnimationOptionTransitionCrossDissolve с методом transitionWithView. Он покажет анимацию, но сразу еще одно изображение загрузится из-за вызова reloadData. Как это исправить? Как оживить только изображения в UICollectionView

Любая идея оценена!

ответ

0

Ну, я думаю, что в вашем методе cellForItemAtIndexPath вы не настраиваете анимацию вправо.

воспользуйтесь пожалуйста.

[UIView animateKeyframesWithDuration:1.0 delay:0.1 options:UIViewKeyframeAnimationOptionAutoreverse animations:^{ 
    cell.articleImage.image = [UIImage imageNamed:[NSString stringWithFormat:@"%@.jpg", [images objectAtIndex:i]]]; 
} completion:nil]; 

Вы не назначили задержку должным образом, чтобы анимация работала.

Надеюсь, что это сработает для вас сейчас. Благодаря

+0

Он не будет показывать анимацию Fadein Fadeout. – Praveenkumar

+0

, то попробуйте изменить значение альфа в блоке анимации. –

+0

[Уже пробовал] (http://stackoverflow.com/questions/28605773/uiimageview-fade-animation-with-uicollectionview/28605985?noredirect=1#comment45516371_28606007) – Praveenkumar

0

Моя анимация работа, как это:

cell.articleImage.alpha = 0.0; 
[UIView animateWithDuration:0.3f animations:^{ 
    [cell.articleImage setAlpha:1.0]; 
}]; 
+0

Пробовал с Альфа ставки. Не работает правильно. Я хочу использовать точную анимацию. Не используется Alpha. – Praveenkumar

0

Попробуйте добавить анимацию для видимых ячеек без перезагрузки CollectionView:

NSArray* visibleCells = [collectionView visibleCells]; 
[visibleCells enumerateObjectsUsingBlock:^(UICollectionViewCell* cell, NSUInteger idx, BOOL *stop) { 
    //TODO: add animation; 
}]; 

Update
Чтобы анимировать новые клетки, вы должны запускать анимацию после добавления ячейки в окно. В ячейке можно переопределить метод didMoveToWindow:

- (void)didMoveToWindow 
{ 
    [super didMoveToWindow]; 
    if (self.window && self.shouldStartAnimation) 
    { 
    [self startAnimation]; 
    } 
} 

И в ViewController эти методы:

- (void)animateVisibleCells 
    { 
     NSArray* visibleCells = [self.collectionView visibleCells]; 
     [visibleCells enumerateObjectsUsingBlock:^(BTCollectionViewCell* cell, NSUInteger idx, BOOL *stop) { 
      [cell startAnimation]; 
     }]; 
    } 


    #define ANIMATION_DURATION (0.3) 
    - (void)animateCells 
    { 
     self.shouldAnimationStart = YES; 

     [self animateVisibleCells]; 

     [NSTimer scheduledTimerWithTimeInterval:ANIMATION_DURATION target:self selector:@selector(endAnimateCells) userInfo:nil repeats:NO]; 
    } 


    - (void)endAnimateCells 
    { 
     self.shouldAnimationStart = NO; 
    } 


    - (void)collectionView:(UICollectionView *)collectionView willDisplayCell:(UICollectionViewCell *)cell forItemAtIndexPath:(NSIndexPath *)indexPath 
    { 
     ((BTCollectionViewCell*)cell).shouldStartAnimation = self.shouldAnimationStart; 
    } 

Но проблема с синхронизацией анимации по-прежнему (новая анимация будет начинается с 0 раз). Если вы знаете метод запуска анимации из конкретного времени, вы можете использовать его метод в willDisplayCell

+0

Его работы. Но всякий раз, когда я просматриваю его. Одновременные изображения не анимированы. Подобно таймеру. – Praveenkumar

+0

Я обновил свой ответ. –