通过图像更改为单个 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 中的图像不是占位符图像并附加到 UIImage 数组
UIPageControl 自定义类 - 发现 nil 将图像更改为点