0

我的应用程序开头有一个简单的动画。

它在主视图上显示一个 UIView,该 UIView 在启动时在屏幕外显示动画。我只希望它在应用程序启动时制作动画,而不是每次加载主视图时。我的问题是使用我的代码我可以根据需要停止动画,但是它会在加载主视图时恢复到覆盖视图的开始状态。

总而言之,我想将 UIview 设置为离开屏幕的动画,并使其保持在那里,直到应用程序重新启动。非常感谢任何建议

- (void)viewDidLoad
{



    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(performAnimation:) name:UIApplicationDidBecomeActiveNotification   object:nil];




[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.

 }

 - (void)viewDidUnload
{
[[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationDidBecomeActiveNotification object:nil];

[self setDoorbottom:nil];
       [super viewDidUnload];
// Release any retained subviews of the main view.
}

 - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
 {
return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

- (IBAction)alert:(id)sender {


UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"" message:@"" delegate:nil cancelButtonTitle: @"Dismiss" otherButtonTitles: nil];

[alert show];

}

- (void)performAnimation:(NSNotification *)aNotification {

    // Animation code.

CGRect doorbottomFrame = doorbottom.frame;
doorbottomFrame.origin.y = self.view.bounds.size.height;

[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.5];
[UIView setAnimationDelay:0.3];
[UIView setAnimationCurve:UIViewAnimationCurveEaseOut];

doorbottom.frame = doorbottomFrame;

[UIView commitAnimations];

CFBundleRef mainBundle = CFBundleGetMainBundle();
CFURLRef soundFileURLRef;
soundFileURLRef = CFBundleCopyResourceURL(mainBundle, (CFStringRef) @"Air", CFSTR
                                          ("wav"), NULL);
UInt32 soundID;
AudioServicesCreateSystemSoundID (soundFileURLRef, &soundID);
AudioServicesPlaySystemSound (soundID);

  }
@end
4

5 回答 5

1

Matt Drance 和 Paul Warren 在他们的iOS 食谱书中非常详尽地介绍了这一点。解释相关部分:假设您在加载期间使用 default.png 作为一种启动屏幕,那么您需要将动画封装在它自己的视图控制器中,并且呈现作为应用程序根视图控制器之外的模态视图控制器...

时间在这里很关键,根控制器的视图必须在它呈现模态视图控制器之前就位,所以在 didFinishLaunchingWithOptions 中你会:

  • 实例化一个包含启动画面动画视图控制器的 navcontroller 视图
  • 将该导航控制器作为子视图添加到窗口
  • 以模态方式呈现导航控制器 -

需要考虑是否显示状态栏等细节...... Drance/Warren 的书包括源代码和更全面的解释。

于 2012-08-04T15:15:04.297 回答
1

其他人建议将触发启动动画的代码放在 applicationDidFinishLaunching:withOptions 中。

然而,这有一个潜在的问题。

从 iOS 4 开始,您的应用程序会在用户按下主页按钮时切换到后台,然后在用户再次点击应用程序图标时获得切换到前台通知。您可以持续数周而不会收到另一个启动通知。在用户看来,他们好像在再次启动您的应用程序,但系统不这么认为。

在决定在 applicationDidFinishLaunching:withOptions 中触发动画之前,请确保这是您想要的:

如果您将代码放在移至前台方法 (applicationWillEnterForeground) 中,您将拥有更大的灵活性。如果您使用该方法,您可以创建逻辑来决定是将其视为启动还是从后台返回。(例如,当您进入后台时保存一个时间戳,如果自您上次进入后台以来已经过了一定时间(一个小时?),则将前台通知视为启动。

于 2012-08-05T13:45:08.650 回答
1

在您的初始应用程序 luanch 之后调用第一个方法,application: didFinishLaunchingWithOptions:因此,在其中调用您的动画而不是viewDidLoad.

application: didFinishLaunchingWithOptions:您将在您的应用程序委托中找到此方法。

生命周期

在此处输入图像描述

这张照片的所有功劳归于:Apple 文档

于 2012-08-04T14:29:26.507 回答
1

在我自己的项目中,我通过在我的应用程序委托中实例化的临时视图控制器处理启动画面:

SDSSplashViewController* splash = [[SDSSplashViewController alloc] init];
[window addSubview:splash.view];

SDSSplashViewController调用相当于你performAnimation在它的viewDidLoad. 在动画结束时,它将视图从其父视图中移除。这非常干净,非常适合重复使用。

您可以在 applicationDidFinishLaunching 中实例化视图控制器(如上),如果您希望它只执行一次,或者applicationDidBecomeActive如果您希望每次应用程序激活时执行动画(这就是您在代码中所做的)。

关于您当前的问题:我假设您在 xib 文件中定义了门底视图(因为您不在 viewDidLoad 中并且您不提供 loadView)。

在这种情况下,发生的情况是:每次加载视图时,都会按照您在 xib 中定义的方式加载它。因此,如果它在那里可见,并且与您的视图的其余部分重叠,那么当您不进行动画处理时,它将保持这种状态。一个简单的解决方法是hidden在 xib 中制作动画视图,然后首先在以下位置取消隐藏它performAnimation

- (void)performAnimation:(NSNotification *)aNotification {

   // Animation code.

   doorbottom.hidden = NO;
   ...

希望能帮助到你。

于 2012-08-05T07:57:24.360 回答
0

如果您需要一个事件只发生一次,您可以在 AppDelegate 类中创建一个 bool 属性,并在第一次为 UIView 设置动画时将其设置为 true。例如:

    - (void)viewDidLoad
    {

    AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
    BOOL animated =appDelegate.animated;
    if(!animated)
    {
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(performAnimation:) name:UIApplicationDidBecomeActiveNotification   object:nil];
        appDelegate.animated =YES;
    }

     [super viewDidLoad];
      // Do any additional setup after loading the view, typically from a nib.

 }
于 2012-08-04T14:33:12.730 回答