3个具有不同间隔的UIImageView动画

时间:2014-04-15 20:18:31

标签: ios objective-c image uiimageview uikit

我有3张图片,我想按顺序显示给用户。从一个移动到另一个的时间以及图像对用户可见的时间不是恒定的,它对于每个图像都是变化的。有人能指出我完成这项工作的最佳方法吗?谢谢你的任何指示。

更清楚的是,我正在寻找像UIImageView.animationImages这样的东西然后开始动画.. 然而* 我想控制每个图像中的动画时间以及每个图像停留的时间在下一个图像动画之前到位。

2 个答案:

答案 0 :(得分:0)

一个非常基本的解决方案可能是

- (void) showSequence{
//show image 1
//hide image 2, 3
double delay1 = 2.0;
double delay2 = 3.0;
double delay3 = 5.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delay1 * NSEC_PER_SEC));
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
    //hide image 1
    //show image 2
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delay2 * NSEC_PER_SEC));
    dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
        //hide image 2
        //show image 3
        dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delay3 * NSEC_PER_SEC));
        dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
            //hide image 3
            //all 3 images has been shown
        });
    });
});

}

我由你来修改代码以防止重复

答案 1 :(得分:0)

好的,我怎么做。

您需要两个图像视图。

@property UIImageView *currentImageView;
@property UIImageView *nextImageView;

我认为你会有一些这样的模型,包括等待时间和过渡时间。

像这样......

@{
    @"imageName": @"image1",
    @"waitTime": @2.0,
    @"transitionTime": @0.4
}

然后将它们存储在类似......的数组中

@property NSArray *transitionImages;

这将使一切变得更加容易。

现在你有了一个功能。

- (void)transitionToImageAtIndex:(NSInteger)index
{
    NSDictionary *transitionImage = self.transitionImages[index];

    self.nextImageView = [UIImage imageNamed:transitionImage[@"imageName"]];

    [UIView animateWithDuration:[transitionImage[@"transitionTime"] floatValue]
                     animations:^(){
                         // crossfade between the two views
                         self.nextImageView.alpha = 1.0;
                         self.currentImageView.alpha = 0.0;
                     }
                     completion:^(BOOL finished){
                         // swap the image views over
                         UIImageView *tempImageView = self.nextImageView;
                         self.nextImageView = self.currentImageView;
                         self.currentImageView = tempImageView;

                         // get the index of the next image
                         NSInteger nextIndex = index + 1;
                         if (nextIndex >= self.transitionImages.count) {
                             // reset to 0 if outside array bounds
                             nextIndex = 0;
                         }

                         // trigger the tradition to the next image recursively with correct delay
                         [self performSelector:@selector(transitionToImageAtIndex:) withObject:@(nextIndex) afterDelay:[transitionImage[@"waitTime"] floatValue]];
                     }];
}

这将递归地工作并永远继续前进。它不会阻止UI或其他任何内容,因此应用程序的其余部分将继续工作。

您也可以在此方法的开头进行检查以阻止其运行。这将停止循环。