• 締切済み

setAnimationDidStopSelectorについて教えてく

setAnimationDidStopSelectorについて教えてください(iPhone SDK) 以下のようなコードを組んでいるのですが、setAnimationDidStopSelectorで指定したendDropPartメソッドの中で、どうやってアニメーションさせるオブジェクトを指定するか悩んでいます。iPhone SDKは初心者です。どなたかご教授いただけないでしょうか? -(void)endDropPart{ /* [下のメソッドのrrecieverが指すボタン setAlpha:1.0f]; */ NSLog(@"endAnim"); } - (void)DropPart:(UIButton *)reciever { [player play]; CGFloat y = [reciever center].y; [UIView beginAnimations:nil context:nil]; [UIView setAnimationDuration:0.5f]; [UIView setAnimationDelegate:self]; [UIView setAnimationDidStopSelector:@selector(endDropPart)]; [reciever setCenter:CGPointMake([reciever center].x, y+150)]; [reciever setAlpha:0.0f]; [UIView commitAnimations]; }

みんなの回答

  • harawo
  • ベストアンサー率58% (3742/6450)
回答No.1

> [UIView setAnimationDidStopSelector:@selector(endDropPart)]; アニメーション終了時に呼び出されるDelegateは、「- (void)animationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context」にしたほうがいい(should be)と、UIViewのリファレンスに書かれています。それはご存じですよね? この引数のcontextは、「+ (void)beginAnimations:(NSString *)animationID context:(void *)context」の引数contextを引き継ぎます。 contextに「(UIButton *)reciever」(receiverという命名には、強い違和感を覚えます。ふつうはsenderとしますね)を代入することで、ボタンのポインタを終了時のDelegateに渡せます。 なお、contextは、(void *)とあるように、ポインタ値のみで、クラスがなんであるかは受け渡さないので、すこし手間をかける必要があります。

seventhwon
質問者

お礼

ありがとうございました。ヘルプで「、「- (void)animationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context」」の構文を利用すべしということは理解していたのですが、Contextの利用方法がいまいちわからなかったので、ちょっと尻込みしていました。ご回答の内容を参考にして、最適化をしていきたいと思います。

関連するQ&A

  • Objective-C ボタンを動かすには

    Objective-Cはまったくの初心者で、iPhone用のアプリを作るのに書籍を見ながらサンプルをいじっています。 画像をタップしたらその画像自体が動くようなものを作りたいのですが、 RoundRectButtonを1個だけ配置して 【imageTestViewContollorer.h】 @interface imageTest1ViewController : UIViewController { IBOutlet UIButton *myButton; } -(IBAction)tapBtn; @end 【imageTestViewContollorer.m】 @implementation imageTestViewController -(IBAction)tapBtn{ myButton.center=CGPointMake(50,50); [UIView beginAnimations:nil context:nil]; [UIView setAnimationDuration:2]; myButton.center=CGPointMake(160, 240); [UIView commitAnimations]; } としてみましたが、コンパイルエラーなどはありませんでしたが、ボタンを押しても何も起こりませんでした。 IBOutlet UIButtonが臭いような気もしているのですが、UIImageViewにするとRoundRectButtonと線を繋げなくなりますし、どう直してよいか見当もつかず困っています。 画像がタップされたら動く、みたいなものをそもそもRoundRectButtonに画像を割り当てた方がいいのかImageViewにタップされた場合の処理を割り当てた方がいいのかどうかもよくわかりません。 よろしくお願いいたします。

  • iPhoneアプリ とある質問です。

    NSTimerの中のUIViewアニメーションが動きません。 NSTimerの中のアラームは動いているので、NSTimerは動いていると思うのですが。。。 3週間、思いつく限り色々と試したり、参考書見たり、ネットで調べたりしたのですが、お手上げです。 ヒントでもかまいませんので、アドバイスを頂けたら幸いです。 まず状況としては、 h.ファイルで、アニメーションで動かしたい、IBOutlet UIButton *mを宣言してあります。 次に、UISwitchのON,OFFでNSTimerが起動します。 musicClock = [NSTimer scheduledTimerWithTimeInterval:0.4 target:self selector:@selector(test:) userInfo:nil repeats:YES]; そして、NSTimerの中で、以下のようにプログラムしてあります。 条件にあてはまれば、音楽とアニメーションが画面上で動くことを意図しています。 -(void)test:(NSTimer*)timer{ musicDate = [datePicker date]; NSTimeInterval t = [musicDate timeIntervalSinceNow]; NSLog(@"NSTimeInterval:%f",t); //アラームの処理 if (t <=0.0 && t > -600.0){ if (!musicAlarm.playing) //アニメーションの定義開始 [UIView beginAnimations:nil context:nil]; [UIView setAnimationDuration:0.4]; [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; int x = rand() % 320; int y = rand() % 480; m.center = CGPointMake(x, y); [musicAlarm play]; [UIView commitAnimations];

  • Objective-Cのメソッド効率化

    下のコードは UIButton のbutton1を押すと そのボタン自身が一回だけ10px上に移動し、 戻るコードです。 例えばこのボタンがひとつだけでなく 10個ある場合を考えて - (IBAction)move2 { int x = button2.center.x; int y = button2.center.y; ~~~ } と10個記述していくのではなく、 うまく関数化したいのですが どのような式を考えたら良いのでしょうか? よろしくお願い致します。 - (IBAction)move1 { int x = button1.center.x; int y = button1.center.y; [UIView animateWithDuration:0.2f delay:0 options:UIViewAnimationOptionCurveEaseOut animations:^{ button1.center = CGPointMake(x, y-10); } completion:^(BOOL finished){ [UIView animateWithDuration:0.3f delay:0 options:UIViewAnimationOptionCurveEaseOut animations:^{ button1.center = CGPointMake(x, y); } completion:^(BOOL finished){ }]; }]; }

  • iPhone SDK UIViewに追加したUIButtonが反応しな

    iPhone SDK UIViewに追加したUIButtonが反応しない。。。 インターフェイスビルダーにあるUIViewにボタンを追加した場合は、 ちゃんとボタンは反応するんですが、プログラムから追加したUIViewにボタンをおくと UIControlEventTouchUpInsideのイベントに反応しません。 一応、こちらに簡単なプロジェクトもあげておきました。 http://gemic.jp/xcode/buttonOnView.zip 詳細は、下記です。 View-Based Applicationテンプレートで作成したプロジェクト(buttonOnView) buttonOnViewViewController.h #import <UIKit/UIKit.h> @interface buttonOnViewViewController : UIViewController { UIView *theView; } @end ----------------------------------------------------------------- buttonOnViewViewController.m - (void)viewDidLoad { [super viewDidLoad]; self.view.backgroundColor = [UIColor redColor]; UIButton *btn1 = [[UIButton buttonWithType:UIButtonTypeRoundedRect]retain]; [btn1 initWithFrame:CGRectMake(60, 90, 200, 50)]; //このボタンは反応する↓ [self.view addSubview:btn1]; [btn1 setTitleColor:[UIColor redColor] forState:UIControlStateNormal]; [btn1 addTarget:self action:@selector(createView:) forControlEvents:UIControlEventTouchUpInside]; } - (IBAction)createView:(UIButton*)sender { theView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)]; [theView setBackgroundColor:[UIColor greenColor]]; [self.view addSubview:theView]; UIButton *btn = [[UIButton buttonWithType:UIButtonTypeRoundedRect]retain]; [btn initWithFrame:CGRectMake(60, 150, 200, 50)]; //このボタンは反応しない↓ [theView addSubview:btn]; [btn addTarget:self action:@selector(deleteView:) forControlEvents:UIControlEventTouchUpInside]; } - (IBAction)deleteView:(UIButton*)sender { NSLog(@"touch event reaction"); [theView removeFromSuperview]; } ----------------------------------------------------------------- いろいろググってみたり、DevCenterのドキュメントを探したんですが、 思ったような情報が見つからず相当はまってます。 ネットで探して見つからないってことは、凄く初歩的なことか?? と思ってるんですが、、、 どなたか、助けていただけたらありがたいです。

  • Xcodeで開発してますが。。

    CGAffineTransformMakeScalの動きがおかしいです。 下記コード一部抜粋しています。5行目です。 Xcodeは Version 5.1.1 です ----- ボタンが押されると、numericButtonPressedを実行し、途中で [self animateButton:button];により拡大/縮小のアニメーションをつけるプログラムです。 ----- アニメーションでX方向/Y方向に2倍拡大はできるのですが、左上からの座標も指定した分だけ ずれてしまいます。 button.center = CGPointMake(0, 0);を挿入したりしてもダメです。 CGAffineTransformMakeScaleの仕様なのか、プログラムがおかしいのかわかりません どう対処すればよいか、教えてください。 ◆◆◆◆コード一部抜粋 - (void)animateButton:(UIButton*)button { [UIView animateWithDuration:1 animations:^{ // 位置までずれてしまう。。。 button.transform = CGAffineTransformMakeScale(2, 2); } completion:^(BOOL complete){ [UIView animateWithDuration:1 animations:^{ button.transform = CGAffineTransformIdentity; } ]; } ]; } - (IBAction)numericButtonPressed:(id)sender { UIButton *button = (UIButton*)sender; [self animateButton:button]; // 拡大/縮小のアニメーション NSString *numericChar = button.titleLabel.text; int number = [numericChar intValue]; if ([opString isEqualToString:@"="]) { calcValue = 0; opString = nil; } calcValue = calcValue * 10 + number; opApplied = NO; [self updateResultLabel]; } ◆◆◆◆

  • iPhoneSDKのNSTimerについて

    はじめまして、keeperです。 この度はiPhoneSDKのアプリ開発のNSTimerについてお聞きしたい事があります。 キャラクター1の画像を表示させ、NSTimerを使い一定の時間間隔で画像をキャラクター1からキャラクター2に変更したいのですが、呼び出すメソッドがわかりません。 どなたかご教授いただければ幸いです。 -(void)move:(NSTimer *)timer { [UIView beginAnimations:nil context:nil]; [UIView setAnimationDuration:1]; **ここの部分になんと命令すればよろしいでしょうか?** [UIView commitAnimations]; } どうか、よろしくお願い致します。

  • UIButtonを始点とするフリックの取得について

    iPhoneアプリの開発を行っています。 その中で、あるView(下記ソースではtestView)の中でフリックが行われた場合に 特定の動作をさせるようにしたいと考え、下記のソース引用の通り実装しました。 ViewControllerの中にUIView(testView)を配置し、その中に、UIButton(testButton) を配置し、フリックが行われた際の開始位置と終了位置を取得しています。 ですが、下記実装ですと、フリックの開始位置が、testButton上である場合、 ViewController.m 上の、touchesBegan、touchesEnded を通りません。 カスタムのボタンを作って試してみたところ、ButtonのtouchesBegan、 touchesEndedには入ってきており、testButtonが非活性の場合には、 ViewController.m 上の、touchesBegan、touchesEnded を通って いるようですので、ボタン側のイベントが反応し、ViewController.m に入ってこず終了しているものと思っています。 これを、testView上のどの位置でフリック開始された場合でも同様の 処理をさせたいのですが、何か良い解決方法をご存知でしたら、 ぜひ、お知恵をお借りしたいです。 プログラム初心者のため、つたない質問で申し訳ありません。 よろしくお願いいたします。 ■ViewController.h の実装 ----------------------------------------- @interface ViewController : UIViewController { // フリック開始位置、終了位置 CGPoint _tBegan, _tEnded; } // ビュー @property (weak, nonatomic) IBOutlet UIView *testView; // @property (weak, nonatomic) IBOutlet UIButton *testButton; ■ViewController.m の実装 ----------------------------------------- // タッチ開始 -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ UITouch * touchBegan = [touches anyObject]; _tBegan = [ touchBegan locationInView: self.testView ]; } // タッチ終了 -(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{ UITouch * touchEnded = [touches anyObject]; _tEnded = [ touchEnded locationInView: self.testView ]; NSInteger distanceHorizontal = ABS( _tEnded.x - _tBegan.x ); NSInteger distanceVertical = ABS( _tEnded.y - _tBegan.y ); NSLog(@"%d", distanceHorizontal); NSLog(@"%d", distanceVertical); NSLog(@"X:%f->%f", _tBegan.x,_tEnded.x); NSLog(@"Y:%f->%f", _tBegan.y,_tEnded.y); if ( distanceHorizontal > distanceVertical ) { if ( _tEnded.x > _tBegan.x ) { NSLog(@"RIGHT Flick"); // スタート位置がmoveView内の場合、右フリックに応じた処理を記述予定 } else { NSLog(@"LEFT Flick"); // スタート位置がmoveView内の場合、左フリックに応じた処理を記述予定 } } else { if ( _tEnded.y > _tBegan.y ) { NSLog(@"DOWN Flick"); // 下向きフリックに応じた処理を記述予定 } else { NSLog(@"UP Flick"); // 上向きフリックに応じた処理を記述予定 } } }

  • iphone sdkにてアプリケーションを作成するときappDeleg

    iphone sdkにてアプリケーションを作成するときappDelegateのプログラムを通してUIViewなどいろいろなBuilderの処理を行いますが、appDelegateのメソッドのオブジェクトは、なんという名前でオブジェクトの作成がされるのですか? appDelegateのオブジェクト名->UILabelなどの記述でほかのメソッドからappDelegateのインスタント変数にアクセスしたいのですが、もしよろしければ教えてください。

    • 締切済み
    • Mac
  • ios/バックグラウンドからループを呼び出したとき

    objective-cで、バックグラウンドに入ったときに、for文のあるメソッドを呼び出したところ、ループが終わると画面が黒くなってしまいます。落ちてはいないです。どうなっているんでしょうか? 以下が実際のソースです - (void)viewDidLoad { [super viewDidLoad]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(test) name:UIApplicationDidEnterBackgroundNotification object:nil]; } -(void)test{ for (int i; i < 5; i++) { NSLog(@"%d", i); [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:2.0f]]; } }

  • iphone アプリのソースについて

    iphoneのアプリを作成しています。 上手く作動しないので教えてください。 下のようにボタンを押すとターゲットが移動するプログラムを書いています。 -(void)viewDidLoad { target.center = CGPointMake(200, 300); } -(IBAction)pushbtn { target.center = CGPointMake(300, 100); } でなんですが、今のプログラムだと移動時にスーっと動いていく感じになってしまいます。 個人的にはスーっと動くのではなくパッと移動(ワープ)する感じにしたいのですが、どのようにすればよいでしょうか? hiddenとか入れてみましたが駄目でした。 あとiphoneではないですが、androidの画面デザインが簡単に出来るソフトなどを知っていましたら教えてください。

専門家に質問してみよう