2012-05-03 10 views
0

iPadアプリケーションでアニメーションに問題があります。私は、アプリが起動したときに画面に表示される4つのUIButtonを持っています。アプリの読み込み時に画面外からUIButtonをアニメーション化する

私は基本的には、アプリケーションを読み込み、4つのボタンを画面の上部から一度に1つずつビューにアニメーションしたいと思っています。

私は以下のようなアニメーションを持っていますが、私はそれに苦労しています。

-(void)viewWillAppear:(BOOL)animated 
{ 
    CGPoint newLeftCenter = CGPointMake(15.0f + myCocoButton.frame.size.width/2.0f, myCocoButton.center.y); 
    [UIView beginAnimations:nil context:nil]; 
    [UIView setAnimationDuration:4.0f]; 
    myCocoButton.center = newLeftCenter; 
    [UIView commitAnimations]; 

} 

私が持っている現在のコードは、ボタンをアニメーションしますが、私が望む方法ではありません。私は実際にそれを私が望むところに正確に置く方法を頭に浮かべることはできません。

+0

今のコードには何が問題なのですか? –

+0

それは私が欲しいものを正確にしません。私はIBのビューのボタンを置く必要があり、私はそれが私がそれをしたい場所に正確に置くことの周りに私の頭を得ることができない –

+0

ペン先を使用していますか? –

答えて

0

私は、このテーマに関するブログ記事書いた:http://www.roostersoftstudios.com/2011/07/01/iphone-dev-performing-sequential-uiview-animations/

を、私はそこにサンプルプロジェクトを持っています。

アニメーションをチェーンすることができます。アニメーションが終了すると、次のアニメーションの機能が呼び出されます。あなたはあなたが持っている正確な問題についてより具体的になりますか?

+0

問題点私は、画面上のどこにボタンを残しても、私はそれが最終的には残りません。さらに、私はIBのボタンを画面から外して表示するようにしなければなりません。確かにそれをやるための「適切な」道がなければならない。あなたのリンクを読んでください。 –

+0

画面から何かを設定したいのはコードなので、乱雑なIBファイルを管理する必要はありません。だからあなたが "viewDidLoad"のようなものを行うことができますしたい場合は、ビューの外にボタンを保つだけです: – rooster117

+0

[self.view addSubView:yourbutton]; yourbutton.frame = CGRectMake(100、-100、yourbutton.frame.size.width、yourbutton.frame.size.height); – rooster117

2

ストーリーボードで、ボタンを最終的な位置に配置します。元の場所に戻ってそれらをアニメーション化し、viewDidAppear:

@implementation MyViewController { 
    CGPoint _button0TrueCenter; 
    CGPoint _button1TrueCenter; 
    CGPoint _button2TrueCenter; 
    CGPoint _button3TrueCenter; 
} 

static void moveButtonAndSaveCenter(UIButton *button, CGPoint offscreenCenter, CGPoint *trueCenter) { 
    *trueCenter = button.center; 
    button.center = offscreenCenter; 
} 

- (void)viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:animated]; 
    if (animated) { 
     moveButtonAndSaveCenter(self.button0, CGPointMake(-100, 100), &_button0TrueCenter); 
     moveButtonAndSaveCenter(self.button1, CGPointMake(420, 100), &_button1TrueCenter); 
     moveButtonAndSaveCenter(self.button2, CGPointMake(-100, 200), &_button2TrueCenter); 
     moveButtonAndSaveCenter(self.button3, CGPointMake(420, 200), &_button3TrueCenter); 
    } 
} 

その後:

static void animateButton(UIButton *button, CGPoint newCenter, NSTimeInterval delay) { 
    [UIView animateWithDuration:.25 delay:delay options:0 animations:^{ 
     button.center = newCenter; 
    } completion:nil]; 
} 

- (void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 
    if (animated) { 
     animateButton(self.button0, _button0TrueCenter, 0); 
     animateButton(self.button1, _button1TrueCenter, 0.2); 
     animateButton(self.button2, _button2TrueCenter, 0.4); 
     animateButton(self.button3, _button3TrueCenter, 0.6); 
    } 
} 
+0

hhhmm、私はそのすべてを実装しましたが、アプリケーションがボタンを読み込んだときは、もともとストーリーボードを通して配置されたボタンとまったく同じ場所にとどまりました。 –

2

をあなたは持っていると仮定しviewWillAppear:

、各ボタンの位置を保存し、オフスクリーンボタンを移動あなたのボタンを配列に入れて、あなたはこのようなことをすることができます(あなたのアイテムはペン先の正しい最終位置にあるはずです)

- (void)viewDidAppear:(BOOL)animated 
{ 
    [super viewDidAppear:animated]; 

    CGAffineTransform transform = CGAffineTransformMakeTranslation(0.f, -200.f); 

    [self.buttons enumerateObjectsUsingBlock:^(UIButton *button, NSUInteger idx, BOOL *stop) { 

     button.transform = transform; // This translates the view's off the top of the screen 

     [UIView animateWithDuration:0.25f 
          delay:0.25f * idx 
          options:UIViewAnimationCurveEaseOut   // No point doing easeIn as the objects are offscreen anyway 
         animations:^{ 
          button.transform = CGAffineTransformIdentity; 
         } completion:nil]; 

     }]; 
} 

これは毎回アニメーション化されます。これをやめるためにivarを追加する必要があるかもしれませんし、一度実行した後にYESに設定するだけです。私が見つけた問題は、最初に読み込んだときにviewDidAppear:animatedNOだったので、そのBOOLをチェックとして使うことができなかったということです。

関連する問題