Titainiumでステータスバーにインジケータを表示する

TiUIWebViewで作ったアプリ内ブラウザでページをロード中にインジケータがどこにも回ってないのに気がついて、くるくると回るインジケータを表示したいと思った。
ActivityIndicatorは作る方法があるので、このオブジェクトを作ってナビゲーションバーやツールバーに表示してもいいのだけど、今回はステータスバーに小さく表示したかったのでやり方を探した。

探した

とりあえず本家のドキュメントやQ&Aを探しても見つけられなかったのでソースにダイヴ。

ちなみにステータスバーのインジケータのオンオフはObjective-Cでは以下のように簡単に書ける。

[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];

つまりこれを行っているところ探せばよいというわけで、以下がそれを探した足跡。

$ grep NetworkActivityIndicator -r build/iphone/Classes
$ cd build/iphone/Classes
$ less TiApp.mm
$ grep startNetwork -r .
$ less TiNetworkHTTPClientProxy.m

ほかにもちょいちょい見回ってみたが、結論としてはどうも他の処理をともなわず単にステータスバーのインジケータを回す処理はできないようだ。(言い方を変えるとそのためのProxyがないようだ)

作った

そこでto.brass.utilというidでモジュールを作成し、TiProxyのテンプレートでToBrassUtilNetWorkActivityIndicatorProxyを作成。

ToBrassUtilNetWorkActivityIndicatorProxy.h

決められた作法にのっとってメソッドを宣言。

#import "TiProxy.h"

@interface ToBrassUtilNetworkActivityIndicatorProxy : TiProxy {

@private

}
-(void)show:(id)args;
-(void)hide:(id)args;

@end
ToBrassUtilNetWorkActivityIndicatorProxy.m

そして実装。

#import "ToBrassUtilNetworkActivityIndicatorProxy.h"
#import "TiUtils.h"

@implementation ToBrassUtilNetworkActivityIndicatorProxy

-(void)show:(id)args {
  [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];
}

-(void)hide:(id)args {
  [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];
}

@end

これだけやってbuild.py。
さくっとモジュール完成。

使った

モジュールをtiapp.xmlの編集などで準備をして使ってみる。

var ToBrassUtil = require("to.brass.util");
var networkActivityIndicator = ToBrassUtil.createNetworkActivityIndicator();

networkActivityIndicator.show();

まわった。

隠すときはこれ。

networkActivityIndicator.hide();

隠れた。
ミッションコンプリート。

まとめ

もしかして何か見落として車輪を再発明している可能性もなきにしもあらずだが、こういう簡単なモジュールなら作成開始から15分もあれば確認までできてしまう。
Objective-Cならやり方わかるけどTitaniumだとどうやるのか分からない、なんて処理があったらさくっと作ってしまうのも一手かもしれませんね。

前の記事

CoffeeScriptの@について再び