具有淡入淡出效果的UIImageView animationDuration

时间:2014-04-19 11:12:39

标签: ios objective-c uiimageview

我正在寻找一种(非常)简单的方法来在animationDuration时间内交叉淡化图像。我尝试使用NSTimer和我在这里找到的其他一些东西,但没有解决方案满足或帮助我。

我在一个方法中创建了这个东西(没有评论)......

- (UIImageView *)playSequence{
    NSArray *structureArray = self.contenManager.ImageViewControllerSize;
    NSMutableArray *structuresToPlay = [[NSMutableArray alloc] init];

    // walk thru current collection
    for(NSInteger i = 0; i < [self.currentCollection count]; i++)
    {
        NSInteger index = [[self.currentCollection objectAtIndex:i] integerValue];
        [structuresToPlay addObject:[UIImage imageNamed:[structureArray objectAtIndex:index]]];
    }

    _playSequence = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 1024, 768)];
    _playSequence.animationImages = structuresToPlay;
    _playSequence.animationDuration = 5 * structuresToPlay.count;

    [_playSequence startAnimating];
    return _playSequence;
}

以下是调用该方法的部分......

- (void)justPlaySelection
{
    UIView *justPlaySelection = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 1024, 768)];

    // some background music code ...

    // add play sequence
    [justPlaySelection addSubview:self.playSequence];

    // add close button
    // { ... }

    [self presentSemiView:justPlaySelection];

}

3 个答案:

答案 0 :(得分:0)

- (UIImageView *)playSequence
{
   if (_playSequence == nil)
    {
     NSArray *structureArray = self.contenManager.ImageViewControllerSize;
        NSMutableArray *structuresToPlay = [[NSMutableArray alloc] init];

        // walk thru current collection
        for(NSInteger i = 0; i < [self.currentCollection count]; i++)
        {
            NSInteger index = [[self.currentCollection objectAtIndex:i] integerValue];
            [structuresToPlay addObject:[UIImage imageNamed:[structureArray objectAtIndex:index]]];
        }

        _playSequence = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 1024, 768)];

    }

    _playSequence.animationImages = structuresToPlay;
    _playSequence.animationDuration = 5 * structuresToPlay.count;

    [_playSequence startAnimating];
    return _playSequence;

}

答案 1 :(得分:0)

这是在UIImageViews之间切换的另一种方法,在淡入淡出中加入也不会很难。

- (void) performAnimationOfFrameAtIndex:(NSNumber*)indexNum
{
    int index = indexNum.intValue;

    BOOL completedSequece = index >= [self.frames count];

    if (completedSequece) return;

    UIImageView *imgIn;
    UIImageView *imgOut;

    if (index % 2 == 0) {
        imgIn = self.animationImageViewOne;
        imgOut = self.animationImageViewTwo;
    }
    else {
        imgIn = self.animationImageViewTwo;
        imgOut = self.animationImageViewOne;
    }

    imgIn.image = [self.frames objectAtIndex:index];
    [self.view sendSubviewToBack:imgOut];

    double speed = 0.1;

    [self performSelector:@selector(performAnimationOfFrameAtIndex:) withObject:[NSNumber numberWithInt:index + 1] afterDelay:speed];
}

答案 2 :(得分:0)

我创建了一个完全按照你描述的方式完成的项目(类似于UIImageView动画序列的效果,但图像之间有交叉淡入淡出。)

该项目位于github:https://github.com/DuncanMC/Animate-Img

您需要有2张图片视图。

我使用的技巧是将它们堆叠在彼此之上,并简单地为alpha 1 - >顶部图像视图设置动画。 0,然后在顶部图像视图中切换图像并从alpha 0 - >设置动画。 1.0,所以新图像显示出来。

该项目仅使用5帧演示变形过渡。每个帧都标有一个数字,以便您可以看到帧的变化。它有一个开关,可以让你打开或关闭交叉渐变。