0

我有一个关于 Xcode 的问题。我在网上找到了一个教程,可以让我在屏幕上移动图像。您能否解释一下如何让我的按钮一键向左移动并返回向右(我在任何地方都找不到这个......),然后立即运行另一个 IBAction 允许我切换到另一个子视图?(我自然已经有了这个代码......)。我尝试将两个 IBActions 添加到 1 个集中式中,但它似乎不起作用:-( 在这种情况下,它会立即打开子视图而不向我显示动画。

我尝试了什么:

到现在得到的代码:

-(IBAction) aMove: (id) sender{

    if (bMove == NO) {

        [UIView beginAnimations:nil context:NULL];
        [UIView setAnimationDuration:1.0];
        btnTarget.transform = CGAffineTransformMakeTranslation(-30,0);
        [UIView commitAnimations];
        bMove = YES;

    }else{

        btnTarget.transform = CGAffineTransformIdentity;
        bMove = NO;

    }

}

-(IBAction) aAnimateActivate: (id) sender {

    [self aMove:nil];
    [self targetOpenView:nil]; //Opens the subview

}

我感谢您的帮助!谢谢!

4

2 回答 2

2

concatenate 用于组合动画,我只是将两个动画块(下面显示的两个)放在一起......:

[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:.3];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];

CGAffineTransform transform = CGAffineTransformConcat(CGAffineTransformMakeScale(1, 1),CGAffineTransformMakeTranslation(10, -50));       
btnGuide.transform = transform;
[btnGuide setAlpha:0.0];

[UIView commitAnimations]; 

基本上实现这个代码就可以了……简单!但是......我需要一些额外的代码来进一步实现,例如:

[self performSelector:@selector(aGuide) withObject:self afterDelay:0.0];

(不要介意选择器名称)和:

[NSTimer scheduledTimerWithTimeInterval:.5 target:self selector:@selector(targetOpenView:) userInfo:nil repeats:NO];  
于 2011-08-16T16:44:40.190 回答
0

不查看您的所有程序流程或进行任何实际测试(我发现在使用 Core Animation 时,确保它正常工作的唯一方法是对其进行编码并查看它是否有效)立即出现子视图打开的问题因为在你调用你的"aMove"方法来设置第一个动画之后,线程继续执行下一行代码,即[self] targetOpenView:nil语句,它立即打开子视图,因此不允许显示第一个动画序列。 没有暂停等待第一个动画完成。 动画一旦提交,将在其自己的线程上运行,而您的代码继续在当前线程(可能是应用程序的主线程)上运行。这似乎不是最明智的方式,但您必须将您编写的代码视为设置动画的过程,一旦提交,它就是一个独立的实体,可以自由运行(在您的代码旁边) . Apple 实现的优势在于您可以设置一大堆同时发生的不同动画。Core Animation 的设计目标之一是让程序员不再需要处理各种动画的所有启动和停止,而是让动画协调使用各种延迟持续时间的方法来完成或提供一种动画事件被其他动画观察(并采取行动)的方法。

为了按照您想要的方式制作动画,您需要使用一种方法,该方法仅允许第二个动画在第一个动画结束后开始。一种方法(假设子视图更改将设置为动画本身)是使用completion:处理程序,即仅在第一个动画完成后开始的动画块。另一种方法是让两个动画“一起开始”,但delay:在第二个动画中包含一个参数,该参数等于第一个动画的长度。如果子视图更改不是通过动画完成的,而是通过主线程中的代码完成的,那么您需要设置一个动画委托当动画中发生某些事件时调用它,其中之一是它的完成。Parameter(s) 被传递给您的委托,以告诉您正在发生什么以及哪个动画。

所有这些都在View Programming Guide to iOS的Animations部分通过示例进行了讨论(大约 10 页,可能会几乎准确地告诉你如何做你想做的事):

http://developer.apple.com/library/ios/#documentation/WindowsViews/Conceptual/ViewPG_iPhoneOS/AnimatingViews/AnimatingViews.html#//apple_ref/doc/uid/TP40009503-CH6

此外,为了设置第一个动画以将按钮移动到某处并再次返回,您可能需要阅读上述指南同一部分中的子主题:实现反向动画。我认为这将是做你想做的最干净的方式。

(仅供参考,我在 Core Animation 的 MacOS 方面比在 iOS 方面更好,但是“为什么会立即发生这种情况?”当您了解它的工作原理时,您遇到的问题是一个常见的陷阱。希望这个解释有所帮助。 )

于 2011-08-09T08:56:36.103 回答