2013-10-24 5 views
2

Я пытаюсь оживить последовательность изображений.Продолжительность при анимации ImageView игнорируется

Изменение между изображениями не не должны иметь анимацию, но я использую анимации для управления временем:

-(void)nextImage 
{ 
    [UIView animateWithDuration:0.5 animations:^{ 
     self.imageView.image = [UIImage imageNamed:[NSString stringWithFormat:@"myImage%d",index++]]; 
    }completion:^(BOOL completed){ 
     if (index < 50) 
     { 
      [self nextImage]; 
     } 
    }]; 
} 

Изображения меняются, но независимо от того, что я использую в период, его игнорирует время и проходит как можно быстрее.

Если изменить альфа, то же самое происходит:

-(void)nextImage 
{ 
    [UIView animateWithDuration:0.5 animations:^{ 
     self.imageView.alpha = 1 - index++/100 
    }completion:^(BOOL completed){ 
     if (index < 50) 
     { 
      [self nextImage]; 
     } 
    }]; 
} 

ответ

3

только некоторые свойства UIView являются animatable:

@property frame 
@property bounds 
@property center 
@property transform 
@property alpha 
@property backgroundColor 
@property contentStretch 

image свойства UIImageView не анимируемое.

Если вы с, чтобы обновить изображение внутри UIImageView, вместо этого использовать другую технику, например, в виде блоков:

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.5 * NSEC_PER_SEC),  
    dispatch_get_current_queue(), ^{ 
     // update your image 
    }); 

(Альтернативы:. performSelectorAfterDelay: или NSTimer я рекомендую использовать блоки, хотя.)

Я думаю, что ваша альфа-анимация не работает из-за усечения int в вашем подразделении. Попробуйте это:

self.imageView.alpha = 1.0f - (float)index++/100.0f; 

Проблема с оригинальным разделения является то, что выражение a/b, где оба Интс, выполняется целочисленное деление. Так что если a < b, результатом будет 0 - другими словами, полностью прозрачная настройка альфа для всех значений.

+0

Хорошо, но почему не работает при анимации альфы? – ReloadC

+0

См. Мой ответ ... –

1

Не представляется возможным сделать это с [UIView animateDuration:animations:completion]; Попробуйте использовать NSTimer и вызвать функцию, которая изменить изображение на каждом шагу.

-1

Почему бы не использовать свойство ImageView и установить массив изображений, которые вы хотите оживить?

+0

Это просто изменит отображаемое изображение, анимации не будет. –

+0

Пожалуйста, смотрите оригинальный вопрос: «Изменение между изображениями не обязательно должно иметь анимацию» – slecorne

2

альфа не работает, потому что вы написали

self.imageView.alpha = 1 - index++/100; 

Все здесь является int, так что ваши результаты могут быть только целые значения, то есть 1 или 0. Используйте вместо этого:

self.imageView.alpha = 1.0f - index++/100.0f; 

компилятор сможет неявно преобразовать index к поплавку, но вы могли бы быть явными и написать:

self.imageView.alpha = 1.0f - (CGFloat)(index++)/100.0f; 
0

Вы можете использовать UIImageView свойства анимации тоже, например:

// arrayWithImages 
arrayPictures = [[NSMutableArray alloc] initWithCapacity:50]; 

// The name of your images should 
for (int i=0; i<=49; i++) { 
    UIImage *image = [UIImage imageNamed:[NSString stringWithFormat:@"myImage%d.jpg",i]]; 
    [arrayPictures addObject:image]; 
} 

imageView.animationDuration = 0.5; 
imageView.animationImages = arrayPictures; 

[imageView startAnimating]; 

В зависимости от количества изображений, вы можете иметь некоторые проблемы памяти и будет иметь анимировать изображения, используя более низкое разрешение уровня.

0

Если их проблема связана только с продолжительностью анимации, то может быть анимация не включена, поскольку я столкнулся с этой проблемой в своем приложении ios. Вот простое решение:

Только вы должны добавить [UIView setAnimationsEnabled: YES]; перед запуском блока анимации. поэтому ваш полный код будет таким:

-(void)nextImage 
{ 
    [UIView setAnimationsEnabled:YES] 
    [UIView animateWithDuration:0.5 animations:^{ 
     self.imageView.image = [UIImage imageNamed:[NSString stringWithFormat:@"myImage%d",index++]]; 
    }completion:^(BOOL completed){ 
     if (index < 50) 
     { 
      [self nextImage]; 
     } 
    }]; 
} 
Смежные вопросы