0

アプリの最初に簡単なアニメーションがあります。

起動時に画面外でアニメーション化されるメインビュー上に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

最初のメソッドは、最初のアプリケーションluanchの後に呼び出されます。application: didFinishLaunchingWithOptions:したがって、その中でアニメーションを呼び出すのではなく、呼び出しますviewDidLoad

このapplication: didFinishLaunchingWithOptions:メソッドは、アプリデリゲート内にあります。

ライフサイクル

ここに画像の説明を入力してください

この写真のすべてのクレジットは次のようになります:Apple Documentation

于 2012-08-04T14:29:26.507 に答える
1

MattDranceとPaulWarrenは、iOSRecipesの本でこれをかなり徹底的にカバーしています。関連するセクションの言い換え:ロード中にdefault.pngを一種のスプラッシュ画面として使用していると仮定すると、アニメーションを独自のView Controllerにカプセル化する必要があり、現在はアプリケーションのルートViewControllerから離れたモーダルViewControllerとして存在します..。。

ここではタイミングが重要です。ルートコントローラーのビューは、モーダルビューコントローラーを表示する前に配置する必要があるため、didFinishLaunchingWithOptionsでは次のようになります。

  • スプラッシュスクリーンアニメーションビューコントローラを含むnavcontrollerビューをインスタンス化します
  • そのnavcontrollerをサブビューとしてウィンドウに追加します
  • navコントローラーをモーダルに提示します-

ステータスバーが表示されているかどうかなど、考慮に入れる必要のある詳細があります... Drance / Warrenの本には、ソースコードとはるかに詳細な説明が含まれています。

于 2012-08-04T15:15:04.297 に答える
1

私自身のプロジェクトでは、アプリケーションデリゲートでインスタンス化するアドホックビューコントローラーを介してスプラッシュ画面を処理します。

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

は、であなたとSDSSplashViewController同等のを呼び出します。アニメーションの最後に、スーパービューからビューを削除します。これは非常にきれいで、再利用に最適です。performAnimationviewDidLoad

ビューコントローラ(上記のように)をapplicationDidFinishLaunchingでインスタンス化できます。これを一度だけ実行するapplicationDidBecomeActive場合、またはアプリがアクティブになるたびにアニメーションを実行する場合(コードで行うことです)。

現在の問題について:ドアボトムビューをxibファイルで定義していると仮定します(viewDidLoadを使用しておらず、loadViewを提供していないため)。

この場合、何が起こるかというと、ビューがロードされるたびに、xibで定義したとおりにビューがロードされます。したがって、そこに表示されていて、ビューの残りの部分と重なっている場合は、アニメートしないときにその状態が維持されます。簡単な回避策はhidden、xibでアニメーション化可能なビューを作成し、それを最初に再表示することですperformAnimation

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

   // Animation code.

   doorbottom.hidden = NO;
   ...

それが役に立てば幸い。

于 2012-08-05T07:57:24.360 に答える
1

他の人々は、applicationDidFinishLaunching:withOptionsに起動アニメーションをトリガーするコードを配置することを提案しています。

ただし、これには潜在的な問題があります。

iOS 4以降、ユーザーがホームボタンを押すとアプリケーションがバックグラウンドに切り替わり、ユーザーがアプリアイコンをもう一度タップするとフォアグラウンド通知に切り替わります。別の起動通知を受け取らずに数週間行くことができます。ユーザーにはアプリを再度起動しているように見えますが、システムはそうは考えていません。

applicationDidFinishLaunching:withOptions:でアニメーションをトリガーすることを決定する前に、それが必要なものであることを確認してください。

コードをフォアグラウンドへの移動メソッド(applicationWillEnterForeground)に配置すると、柔軟性が高まります。このメソッドを使用すると、これを起動として処理するか、バックグラウンドからの戻りとして処理するかを決定するロジックを作成できます。(たとえば、バックグラウンドを入力するときにタイムスタンプを保存し、最後にバックグラウンドを入力してから一定の時間(1時間?)が経過した場合は、フォアグラウンド通知を起動として扱います。

于 2012-08-05T13:45:08.650 に答える
0

イベントを1回だけ発生させる必要がある場合は、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 に答える