使用睡眠时间在两个图像之间切换

时间:2011-05-20 19:08:40

标签: iphone objective-c animation uiimageview

按下按钮后,我需要在两张(或者稍后更多)的图片之间切换特定次数,然后等待一两秒钟进行更改。当任何时候按下停止按钮时,切换应该停止。我的代码现在看起来像这样

IBOutlet UIImageView *exerciseView;

- (void) repetitionCycle {

    stopButtonPressed = NO;
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

    for (NSInteger counter = kRepetitions; counter >=0; counter--) {
        exerciseView.image = [UIImage imageNamed:@"blue.jpg"];  
        [NSThread sleepForTimeInterval:kSleepDuration];                                                                 
        if (stopButtonPressed) {break;}     

        image = [UIImage imageNamed:kExerciseEndingPosition];                                                           
        exerciseView.image = [UIImage imageNamed:@"image1.jpg"];
        [NSThread sleepForTimeInterval:kSleepDuration];     

        if (stopButtonPressed) {break;}     
    }

    self.stopRepetitionCycle;
    [pool release];

}

exerciseView是 除了其他东西,在stopRepetitionCycle我只是将stopButtonPressed设置为YES,所以它在第一次完成“for”后停止。 它确实倒计时,它会在一个周期后停止,但它不会改变图片。

在摆弄时,我通过IB设置了初始图片,所以它最终显示了任何东西..有趣的部分,当我在正确的时刻点击停止按钮时,显示第二张图片。所以我猜我每次图像切换时都需要手动设置视图。但

        [self.exerciseView addSubview:image];

给我错误

Incompatible Objective-C types "struct UIImage *", expected "struct UIView *" when passing argument 1 of "addSubview:" from distinct Objective-C type

另外

        [self.exerciseView.image addSubview:image];

不能完成这项工作并给我一个

UIImage may not respond to addSubview

知道我必须在这做什么吗?

非常感谢!

4 个答案:

答案 0 :(得分:1)

... uuhm

你对[NSThread sleep...]的使用困惑我...

实际上:如果你是一个辅助线程(意思是,不是主线程),那么你正在做一些不允许的事情,即trying to access the UI from a secondary thread

这可以解释你所看到的奇怪行为。

另一方面,如果这是主线程,调用sleep...可能不是一个好主意,因为这样你将完全冻结UI,并且你不可能拦截按钮上的点击。 ..

无论如何,我建议使用NSTimer以一定的时间间隔从一个图像移动到下一个图像。当隐藏停止按钮时,您只需取消定时器,幻灯片将结束。很干净。

关于您对图片的错误消息,事实是UIImage不是UIView,因此您无法将其添加为子视图,但这不是不起作用的这里...

答案 1 :(得分:0)

在循环内更新UI几乎可以保证失败。您最有可能使用NSTimer以给定的间隔交换图像。

此外,[self.exerciseView addSubview:image]失败了,因为你传递的是UIImage而不是UIView。使用你的UIImage创建一个UIImageView(它是UIView的子类)并传递它。

答案 2 :(得分:0)

addSubview方法仅用于添加UIViews。您不能将它与UIImage类一起使用。一般语法是:

[(UIView) addSubview:(UIView*)];

替换

[self.exerciseView addSubview:image];  

self.exerciseView.image = image;  

出于同样的原因

[self.exerciseView.image addSubview:image];  

也不起作用。

答案 3 :(得分:0)

使用UIImageView。它内置了对此的支持。

imageView.animationImages = [NSArray arrayWithObjects:[UIImage imageNamed:@"blue.jpg"], [UIImage imageNamed:@"image1.jpg"], nil];
imageView.animationDuration = kSleepDuration * [imageView.animationImages count];

将此功能连接到开始按钮

- (IBAction) startAnimation {
    [imageView startAnimating];
}

这是停止按钮

- (IBAction) stopAnimation {
    [imageView stopAnimating];
}