【BeeCluster】一瞬「うっ」となるTwitterボタンのレスポンスを改善
すみません。この方法は根本的にダメでした。
iOS5.0.1の実機だと一応動作していたのですが、iOS6のシミュレーターでクラッシュしました。
__weak指定の_tweetViewControllerが解放されるのが原因でした。
__weakを外すとリテインサイクルになるかもしれないというウォーニングが出るので、結局この方法は諦めて前回の記事「【cocos2d】BeeClusterにTwitterボタンをつけてハイスコアをツイート」のとおり、ツイートボタンが押された時点でツイッターのビューコントローラーを生成する方法にに戻しました。
適当な事を書いてしまい大変失礼しました。
失敗例としてこの記事は残しておきます。
前回の記事「【cocos2d】BeeClusterにTwitterボタンをつけてハイスコアをツイート」でツイートボタンを実装しましたが、プログラム起動後最初の一回はツイートボタンを押してからTwitterウィンドウが出るまでの間が微妙に長くて一瞬「うっ、押し損ねたかな?」と思った頃にやっと出る感じでした。
今回はタッチ検出時の処理をできるだけ減らし、レスポンスアップを試みました。
TWTweetComposeViewControllerインスタンスに対する操作がonEnterとccTouchesBeganメソッドにまたがるようになるため、ccTouchesBeganメソッド内のtweetViewControllerローカル変数を_tweetViewControllerインスタンス変数に変更しました。_completionHandlerのブロックのところでリテインサイクルとなるのを防ぐため__weak指定とします。
あとは、ツイッターへ表示するテキストを設定する部分と、実際にウィンドウを表示する部分以外は全てonEnterに移動して完成です。
@implementation TitleScene { CCSprite* _tweetButton; UIViewController* _viewController; __weak TWTweetComposeViewController* _tweetViewController; } - (void)onEnter { [super onEnter]; CGSize size = [CCDirector sharedDirector].winSize; _tweetButton = [CCSprite spriteWithFile:@"twitter-bird-dark-bgs.png"]; [self addChild:_tweetButton]; _tweetButton.position = ccp(size.width/2.0 - 110, 130); _tweetButton.scale = 0.4; _viewController = [[UIViewController alloc] init]; if (![TWTweetComposeViewController canSendTweet]) { // ツイッターが使えない状態ならボタンを透明にする _tweetButton.opacity = 0; } else { // ツイッターが使えるなら初期設定をする TWTweetComposeViewController* temp; temp = [[TWTweetComposeViewController alloc] init]; //ツイッター画面を生成 _tweetViewController = temp; // completion handlerの設定、書き込み終了時にこのブロックが呼ばれる。 // TWTweetComposeViewControllerResult型の引数が渡される。 // 引数の内容に関わらずツイッター画面を閉じる _tweetViewController.completionHandler = ^(TWTweetComposeViewControllerResult result) { // 書き込み完了かキャンセルか引数を見ると判別できる if (result == TWTweetComposeViewControllerResultDone) { // 今後完了時の処理を分けるときはここへ } else if (result == TWTweetComposeViewControllerResultCancelled){ // 今後キャンセル時の処理を分けるときはここへ } [_viewController dismissViewControllerAnimated:YES completion:nil]; //ツイート画面を閉じる }; [[[CCDirector sharedDirector] view] addSubview:_viewController.view]; } } #define TOUCH_CIRCLE 40 - (void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { UITouch *myTouch = [touches anyObject]; CGPoint location = [myTouch locationInView:[myTouch view]]; location = [[CCDirector sharedDirector] convertToGL:location]; float distanceTweet = ccpDistance(_tweetButton.position, location); if (distanceTweet < TOUCH_CIRCLE) { // ツイートボタンが押されたとき if ([TWTweetComposeViewController canSendTweet]) { // ツイート可能かチェック int score = [InfoLayer sharedInfo].highScore; [_tweetViewController setInitialText:[NSString stringWithFormat:@"BeeCluster: high score - %d ! ", score]]; [_tweetViewController addURL:[NSURL URLWithString:@"https://itunes.apple.com/jp/app/beecluster/id663801586?mt=8&ls=1"]]; // ツイッター画面を表示 [_viewController presentViewController:_tweetViewController animated:YES completion:nil]; } else { // ツイートできない時(アカウントの設定がないとき)は何もしない } } } @end
以上の改善によりツイッターボタンのレスポンスがかなり改善され「うっ」と感じる事はなくなりました。2回目以降よりはまだ少し遅いですが、許容範囲だと思います。