【问题标题】:UIImageView Delay or revert to different frameUIImageView 延迟或恢复到不同的帧
【发布时间】:2011-10-19 17:49:30
【问题描述】:

好的,所以我一直在搜索,但无法找到此问题的答案。 (而且我认为我找不到它,因为这是一个非常简单的答案,除了我之外每个人似乎都知道。)我正在为 IOS 创建一个应用程序,其中有一些打开动画,然后我需要停止打开动画并然后发生不同的动画。所以我的开场动画工作正常,我让它在最后一帧停止。如何让新动画在开场动画结束时开始?我在 viewDidLoad() 函数下使用 UIImageView。这是我的 ViewController.m 文件的代码:

@implementation ViewController
@synthesize hook_drop_one;
@synthesize hook_swing_one;

- (void)viewDidLoad

{
    [super viewDidLoad];

    hook_drop_aone=[[NSMutableArray alloc] init];
    for (int i=1; i<16; i++) {
        NSString *hookpic=[NSString stringWithFormat: @"hook%d.png",i];
        UIImage *img = [UIImage imageNamed:hookpic];
        if (img) [hook_drop_aone addObject:img];
        [hook_drop_one setAnimationImages:(hook_drop_aone)];
        [hook_drop_one setAnimationDuration:0.9f];
        [hook_drop_one setAnimationRepeatCount:1];
        [hook_drop_one startAnimating];
    }

    hook_swing_aone=[[NSMutableArray alloc] init];
    for (int i=1; i<230; i++) {
        NSString *hookswingpic=[NSString stringWithFormat: @"hookswing%d.png",i];
        UIImage *img = [UIImage imageNamed:hookswingpic];
        if (img) [hook_swing_aone addObject:img];
        [hook_swing_one setAnimationImages:(hook_swing_aone)];
        [hook_swing_one setAnimationDuration:10.2f];
        [hook_swing_one startAnimating];
    }
}

我的 ViewController.h 文件中的代码:

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController{
    IBOutlet UIImageView *hook_drop_one;
    NSMutableArray *hook_drop_aone;
    IBOutlet UIImageView *hook_swing_one;
    NSMutableArray *hook_swing_aone;
}

@property (nonatomic,retain)UIImageView *hook_drop_one;
@property (nonatomic,retain)NSMutableArray *hook_drop_aone;
@property (nonatomic,retain)UIImageView *hook_swing_one;
@property (nonatomic,retain)NSMutableArray *hook_swing_aone;


@end

现在我明白了为什么两个动画会在应用加载时同时运行。我需要弄清楚如何在第一个动画停止后触发一个动画,或者为第二个动画设置延迟。

有人有什么想法吗?

【问题讨论】:

    标签: iphone ios ios4


    【解决方案1】:

    你可以使用

     [CATransaction setCompletionBlock:^{ ... }]
    

    请查看会话 421 WWDC 2011 - 会话的第二部分中有所有信息。

    【讨论】:

    • 我无权参加 WWDC 2011 大会。它说我需要买一张票。我还尝试了 [CATransaction setCompletionBlock:^{ ... }] 并引发错误。
    【解决方案2】:

    使用 i 确定下一个动画的时间,或者您可以通过触摸事件启动动画。

    【讨论】:

    • 使用 i 的值将下一个动画放入 if 块中,检查 i 的值:if(i>=16){ then run next block}
    • 好的,所以当我这样做时,我一定是遗漏了一些原因,导致动画无法启动。我需要将代码放在 viewDidLoad 旁边的不同位置吗?
    • 您可以在与第一个动画相同的块中使用此代码,只需在 viewDidLoad 中初始化 i ,然后将其用于第一个动画,因为我认为当您的第一个动画结束时 i 的值为 16 . 所以你可以使用 " If 语句 for If(i=>16) { 下一个动画,就在第一个动画的 for 循环之后}。
    猜你喜欢
    • 2012-02-08
    • 2020-02-14
    • 1970-01-01
    • 1970-01-01
    • 2012-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-16
    相关资源
    最近更新 更多