通过图像更改为单个 UIImageView 编写多个动画

Posted

技术标签:

【中文标题】通过图像更改为单个 UIImageView 编写多个动画【英文标题】:Program multiple animations for single UIImageView with image change 【发布时间】:2015-10-28 17:30:41 【问题描述】:

我需要在我的应用程序中为 UIImageView 设置动画,并循环更改其中的 UIImage,使其看起来像动画照片幻灯片。

现在我正在使用 NSTimer 每隔N 秒触发一次 UIImage 更改和动画本身:

- (void)viewDidLoad 

    // NSArray initialization

    NSTimer *timer = [NSTimer timerWithTimeInterval:16
                                         target:self
                                       selector:@selector(onTimer)
                                       userInfo:nil
                                        repeats:YES];

    [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
    [timer fire];

    [super viewDidLoad];

这是onTimer 选择器代码:

- (void) onTimer 

    // cycle through max 9 images
    if(imageIndex > 8)
        imageIndex = 0;

    // set the image
    [_imageContainer setImage:[images objectAtIndex:imageIndex]];

    // reset width and height of the UIImage frame
    CGRect frame = [_imageContainer frame];
    frame.size.width -= 170.0f;
    frame.size.height -= 100.0f;
    [_imageContainer setFrame:frame];


    // fade in
    [UIView animateKeyframesWithDuration:2.0f delay:0.0f options:0 animations:^
        [_imageContainer setAlpha:1];
     completion:^(BOOL finished) 
        // image movement
        [UIView animateKeyframesWithDuration:12.0f delay:0.0f options:0 animations:^
            CGRect frame = [_imageContainer frame];
            frame.size.width += 170.0f;
            frame.size.height += 100.0f;
            [_imageContainer setFrame:frame];
         completion:^(BOOL finished) 
            // fade out
            [UIView animateKeyframesWithDuration:2.0f delay:0.0f options:0 animations:^
                [_imageContainer setAlpha:0];
             completion:nil];
        ];
    ];

    imageIndex++;

这似乎是一种非常原始但“有效”的方式来实现我想要的,但我认识到它可能不是理想的方式。

有没有更好的方法来实现我正在寻找的东西?

【问题讨论】:

【参考方案1】:

淡化动画的更新答案

- (void)viewDidLoad

    [super viewDidLoad];

    // self.animationImages is your Image Array
    self.animationImages = @[[UIImage imageNamed:@"Image1"], [UIImage imageNamed:@"Image2"]];

    // make the first call
    [self animateImages];


- (void)animateImages

    static int count = 0;

    UIImage *image = [self.animationImages objectAtIndex:(count % [animationImages count])];

    [UIView transitionWithView:self.animationImageView
                      duration:1.0f // animation duration
                       options:UIViewAnimationOptionTransitionCrossDissolve
                    animations:^
                        self.animationImageView.image = image; // change to other image
                     completion:^(BOOL finished) 
                        [self animateImages]; // once finished, repeat again
                        count++; // this is to keep the reference of which image should be loaded next
                    ];

【讨论】:

幻灯片本身正在运行,但我无法重现动画。代码对图层没有任何影响。 它适用于简单的 UIViewAnimationsOptions,但它不像建议的解决方案那样“灵活”。

以上是关于通过图像更改为单个 UIImageView 编写多个动画的主要内容,如果未能解决你的问题,请参考以下文章

将 UIImageView 从正常更改为突出显示不起作用

将故事板 UIImageView 更改为具有背景颜色的自己的类

检查 UIImageView 中的图像不是占位符图像并附加到 UIImage 数组

UIPageControl 自定义类 - 发现 nil 将图像更改为点

像 FB 封面照片一样在 UIImageView 上调整图像

为 UIImageView 分配图像问题