夏までにiPhone アプリつくってみっか!

趣味でiPhone/Androidアプリを開発し、日々勉強した事を書いています。オープンワールド系レースゲームをUnityで開発中です。

【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回目以降よりはまだ少し遅いですが、許容範囲だと思います。