Cocoa touch 在循环中交换UIImageView图像

Cocoa touch 在循环中交换UIImageView图像,cocoa-touch,Cocoa Touch,我有一个UIImageViews的NSArray,我想循环并快速交换“开”和“关”状态。我在for循环中编写了这样做的代码,而不是在用户点击UIButton(按钮的动作)时调用的方法 这是一个循环: for(int i = 0; i < [Images count]; i++) { if( i > 0 ){ [self toggleImageViewOff:[Images objectAtIndex:i - 1]]; } [self togg

我有一个UIImageViews的NSArray,我想循环并快速交换“开”和“关”状态。我在for循环中编写了这样做的代码,而不是在用户点击UIButton(按钮的动作)时调用的方法

这是一个循环:

for(int i = 0; i < [Images count]; i++) {
    if( i > 0 ){
        [self toggleImageViewOff:[Images objectAtIndex:i - 1]];
    }

    [self toggleImageViewOn:[Images objectAtIndex:i]];

    [NSThread sleepForTimeInterval:0.5f];
}

嗨,帕特里克。请查看UIImageView的animationImages属性,以及animationRepeatCount和animationDuration属性。如果将打开/关闭图像放入数组并将其指定为animationImages属性,则应该能够控制重复和持续时间以获得所需的效果


希望有帮助

嘿,帕特里克。请查看UIImageView的animationImages属性,以及animationRepeatCount和animationDuration属性。如果将打开/关闭图像放入数组并将其指定为animationImages属性,则应该能够控制重复和持续时间以获得所需的效果


希望有帮助

谢谢你。我已经研究过UIIMageView的animationImages属性。这并不是我想要做的。我在几个相互靠近的UIImageView之间循环,给人一种光线在它们之间移动并在它们上方循环的印象。因此,单个UIImageView的动画彼此独立,因为我需要在代码中根据需要交换图像。

谢谢。我已经研究过UIIMageView的animationImages属性。这并不是我想要做的。我在几个相互靠近的UIImageView之间循环,给人一种光线在它们之间移动并在它们上方循环的印象。因此,单个UIImageView的动画彼此独立,因为我需要在代码中根据需要交换图像。

您是否围绕此for循环设置了动画上下文(UIView类方法会这样做)?如果没有它,更改是即时的而不是动画的。

是否围绕此for循环设置了动画上下文(UIView类方法会这样做)?如果没有它,更改将是即时的,而不是动态的。

将循环移动到后台线程是正确的,但是您还需要确保给主运行循环一个更新UI的机会。您应该能够将对toggleImageViewOn:和toggleImageViewOff:的直接调用替换为

[self performSelectorOnMainThread:@selector(toggleImageViewOn:) withObject:[Images objectAtIndex:i] waitUntilDone:NO];

这将在主线程上执行UI更新,并且通过不等待更新完成,您可以给主运行循环一个到达其终点的机会。进度条之类的东西也会遇到同样的问题,在循环结束之前它们不会改变,除非您使用上面的UI更新调用从后台线程进行更新。

将循环移动到后台线程是正确的,但是,您还需要确保为主运行循环提供更新UI的机会。您应该能够将对toggleImageViewOn:和toggleImageViewOff:的直接调用替换为

[self performSelectorOnMainThread:@selector(toggleImageViewOn:) withObject:[Images objectAtIndex:i] waitUntilDone:NO];

这将在主线程上执行UI更新,并且通过不等待更新完成,您可以给主运行循环一个到达其终点的机会。你在进度条上遇到了同样的问题,除非您使用上面的UI更新调用从后台线程进行更新,否则它们在循环结束之前不会更改。

在后台线程上从循环调用peformSelectorOnMainThread:withObject:waitUntilDone:确实会以我认为需要的速度更新视图。我很好奇为什么我需要在主线程上进行UIImageView交换?为什么在后台线程上更改它,然后使用NSThread的sleepForTimeInterval不允许主线程更新图形

我想我需要去阅读运行循环和图形更新发生的位置


非常感谢你的帮助。(我还将尝试比尔·杜德尼(Bill Dudney)的一些额外建议,我认为这些建议将在CoreAnimation的基础上起作用)

在后台线程的循环中调用peformSelector或onMainThread:withObject:waitUntilDone:确实会以我认为需要的速度更新视图。我很好奇为什么我需要在主线程上进行UIImageView交换?为什么在后台线程上更改它,然后使用NSThread的sleepForTimeInterval不允许主线程更新图形

我想我需要去阅读运行循环和图形更新发生的位置


非常感谢你的帮助。(我还将尝试比尔·杜德尼(Bill Dudney)的一些额外建议,我认为这些建议将基于CoreAnimation发挥作用)

问题是,您没有给任何UIImages时间来绘制。绘图代码经过优化,仅绘制所需内容-渲染所有这些中间阶段都经过优化

休眠主线程实际上并没有给它运行的机会

比尔是对的,你需要在你的循环周围设置一个动画上下文。这将捕获您所做的所有UIView更改,然后播放它们。最简单的方法是使用核心动画。核心动画“记录”UIElemenet中的更改并播放它们。您的代码(没有睡眠)在核心动画块中可以正常工作


苹果为核心动画提供了一本合理的食谱,问题是你没有给任何UIImages时间画画。绘图代码经过优化,仅绘制所需内容-渲染所有这些中间阶段都经过优化

休眠主线程实际上并没有给它运行的机会

比尔是对的,你需要在你的循环周围设置一个动画上下文。这将捕获您所做的所有UIView更改,然后播放它们。最简单的方法是使用核心动画。核心动画“记录”UIElemenet中的更改并播放它们。您的代码(没有睡眠)在核心动画块中可以正常工作

苹果有一个合理的食谱