2

我正在尝试为一系列图像制作动画。

图像之间的变化不一定要有动画,但我是用动画来控制时间的:

-(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];
        }
    }];
}

图像在变化,但无论我使用什么持续时间,它都会忽略时间并尽可能快地进行。

如果我更改 alpha,也会发生同样的情况:

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

6 回答 6

3

只有 的一些属性UIView可动画的:

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

a的image属性UIImageView是不可动画的。

如果您要更新 a 中的图像UIImageView,请改用其他技术,例如块:

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

(替代方案:performSelectorAfterDelay:NSTimer。不过我建议使用块。)

我认为您的 alpha 动画由于您的部门中的 int 截断而无法正常工作。尝试这个:

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

原始除法的问题在于表达式a / b(两者都是整数)是作为整数除法执行的。因此,如果a< b,结果将是0- 换句话说,所有值的完全透明的 alpha 设置。

于 2013-10-24T12:41:52.010 回答
2

alpha 不工作,因为你已经写了

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;
于 2013-10-24T12:48:39.820 回答
1

[UIView animateDuration:animations:completion]; 尝试使用 NSTimer 并调用每一步都更改图像的函数是不可能的。

于 2013-10-24T12:41:38.053 回答
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];

根据图像的数量,您可能会遇到一些内存问题,并且必须使用较低级别的解决方案为图像设置动画。

于 2013-10-24T12:56:17.517 回答
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];
        }
    }];
}
于 2014-05-21T10:11:20.297 回答
-1

为什么不使用imagesImageView 的属性并设置要设置动画的图像数组?

于 2013-10-24T12:42:36.530 回答