我想从数组中暂停图像

时间:2014-05-07 08:11:10

标签: ios objective-c

我正在使用以下代码创建动画:

NSMutableArray *dashBoy = [NSMutableArray array];
for (int i = 1; i<= 20; i++) {
    butterfly = [NSString stringWithFormat:@"5c_%d.jpg", i];
    if ((image = [UIImage imageNamed:butterfly]))
        [dashBoy addObject:image];
    }

    [stgImageView setAnimationImages:dashBoy];
    [stgImageView setAnimationDuration:7.0f];
    [stgImageView setAnimationRepeatCount:-1];
    [stgImageView startAnimating];

我的要求是如果dashBoy 5c_10.jpg ,然后暂停图像约5秒然后恢复动画,另一个如果dashBoy 5c_20.jpg ,然后暂停图像再次持续约5秒钟并再次恢复。有可能吗?

2 个答案:

答案 0 :(得分:2)

你不能像UIImageView这样的NSTimer动画使用变速。

虽然有几种方法。

<强> 1。自己动手。

为此,您将使用类似MyTimedImage ------------ UIImage *image CGFloat duration 的内容,并重复触发方法以更改图像。使用此功能,您可以单独为每个图像计时(您甚至可以创建一个包含图像的数据对象以及显示它的时间长度,然后创建和显示这些图像。

<强> 2。操纵当前的方法。

如果您有20张图片,而您希望在7秒内全部显示这些图像,那么...每张图片0.35秒。所以暂停5秒就是大约14张图片。

因此,您可以添加1-9一次,然后再添加10次,而不是添加每个图像。 11-19次,然后是20次。

然后它将像它正在进行交换,但是当它达到10时,它将交换为同一图像的另一个副本,因此看起来它会暂停。

然后,您必须将持续时间......增加到17秒,以便为每张图像获得相似的持续时间。

我该做什么?

虽然这听起来像是一个黑客(因为它),但我认为我先给出第二种方法。工作起来要容易得多,如果确实失败了,你就不会花很长时间来设置它。

第一种方法是设置更多工作,但可以更好地控制动画。

方法1的快速而肮脏的示例

创建类似......的对象

// probably want this as a property
NSMutableArray *timedImages = [NSMutableArray array];

MyTimedImage *timedImage = [MyTimedImage new];
timedImage.image = [UIImage imageNamed:[NSString stringWithFormat:@"5c_%d.jpg", i]];
timedImage.duration = 0.4;

[timedImages addObject:timedImage];

所以......例如......

//set up properties something like this...
@property (nonatomic, assign) NSInteger currentIndex;
@property (nonatomic, assign) BOOL paused;
@property (nonatomic, assign) NSTimer *imageTimer;

- (void)displayNextImage
{
    if (self.paused) {
        return;
    }

    NSInteger nextIndex = self.currentIndex + 1;

    if (nextIndex == [self.timedImages count]) {
        nextIndex = 0;
    }

    MyTimedImage *nextImage = self.timedImages[nextIndex];

    self.currentIndex = nextIndex;    

    self.imageView.image = nextImage.image;

    self.imageTimer = [NSTimer scheduledTimerWithInterval:nextImage.duration target:self selector:@selector(displayNextImage) userInfo:nil repeats:NO];
}

然后你想要一种显示它们的方法......

[self displayNextImage];

使用您已曝光​​的属性,您可以通过按下按钮暂停当前图像上的图像视图(例如)。

要启动此过程,只需运行{{1}},您就可以在图像循环中的任何位置开始。

答案 1 :(得分:1)

使用UIImageView动画,这是不可能的,您可能需要创建自己的动画逻辑,如加载阵列中的所有UIImages和通过计时器,切换到下一个动画帧,当您想要暂停时,使计时器无效