Hatena::Groupiphone-dev

iOS プログラミングメモ

2008-12-03 (Wed)

AppBank さんのレビューのやつ 19:26  AppBank さんのレビューのやつ - iOS プログラミングメモ を含むブックマーク

iPhone / iPod Touch アプリケーションの記事掲載、レビュー依頼について | AppBank – iPhone, スマホのたのしみを見つけよう のフォームから投稿したんですけど、Submit ボタン押すと内容が消えちゃってうまく送れないんだよなぁ。こまった。

mixi 19:55  mixi - iOS プログラミングメモ を含むブックマーク

のアプリ、決定版が出ないけど何か理由があるのかなぁ。さすがに今から作ろうとは思わないけど、有料でも結構売れると思うんだよなー。

遅延型 UISlider 20:37  遅延型 UISlider - iOS プログラミングメモ を含むブックマーク

UISlider の実装をする時って、例えばこんな風になるわですよね。スライドすると、action で指定したメソッドが実行されると。

@implementation NantokaView
- (id) initWithFrame:(CGRect)rect {
   if(self = [super initWithFrame:rect]) {
      slider = [[UISlider alloc] initWithFrame:CGRectMake(0,60,300,20)];
      [slider addTarget:self action:@selector(updateSlider:)
            forControlEvents:UIControlEventValueChanged];
      [self addSubview:slider];
   }
}

- (void) updateSlider:(UISlider *)aSlider {
   int number = round(aSlider.value);
   // hogehoge
}
@end

スライダーを左端から右端に移動した場合、どんなに素早く動かしても、updateSlider が何度か呼ばれます。このため、hogehoge の処理が重たかった場合、スライダーがカクカク動く上に指の動きとシンクロしなくて使い勝手が低下します。というか、スライダーの移動がひどく鈍重に感じます。

そもそも hogehoge に重たい処理は入れんなよって話ですけど、例えば SkyBook のページ切り替え処理を updateSlider の度に行なうと、大変レスポンスが悪く感じます。実際には0.01秒以下の処理なんですけど、画面描画に関わる処理なので影響が大きいんでしょうね。iVBook のように、スライダーを移動させた後に「OK」ボタンを押すって言うインターフェイスも有りだとは思いますが、タッチ回数もボタン類もあまり増やしたくないし。あとは、UISlider のプロパティで continuous を NO にすれば、スライダーから指を離すまでイベントは発生しなくなるんで、場合によってはそれも良いかもしれないですね。

というわけで、素早くスライドした場合に限って hogehoge の処理をスキップするやり方を考えてみました。

@interface NantokaView : UIView {
   UISlider *slider;
   NSTimer *interval;
   int lastNumber;
}

// 宣言やっといてね
@end

@implementation NantokaView
- (id) initWithFrame:(CGRect)rect {
   if(self = [super initWithFrame:rect]) {
      slider = [[UISlider alloc] initWithFrame:CGRectMake(0,60,300,20)];
      [slider addTarget:self action:@selector(updateSlider:)
         forControlEvents:UIControlEventValueChanged];
      [self addSubview:slider];
   }
}

- (void) updateSlider:(UISlider *)aSlider {
   int number = round(aSlider.value);
   if(lastNumber == number) return;
   lastNumber = number;

   if(interval) {
      [interval invalidate];
      [interval release];
   }

   interval = [[NSTimer scheduledTimerWithTimeInterval:0.05
               target:self selector:@selector(updateSliderFromTimer)
               userInfo:nil repeats:NO] retain];
}

- (void) updateSliderFromTimer {
   // hogehoge
}

- (void) dealloc {
   [slider release];
   [interval release];
   [super dealloc];
}
@end

次期バージョン 22:48  次期バージョン - iOS プログラミングメモ を含むブックマーク

そろそろくると思うんだけど、こんだけ時間かかってリジェクトだったら泣けるな。

appbankappbank2008/12/03 19:30RSSから飛んできますよ!
appbankmail at gmail.com
まで宜しくお願いいたします。

ちょっと今立て込んでいますが、週末までにはレビューは致します!!!

appbankappbank2008/12/03 19:36もう一点、
お問い合わせの受理も午前中に受けていることを確認しました。
ご心配せずにお待ちください。

ただid:katayama氏の前にいくつかレビュー依頼が滑り込んでいるのを確認してしまっているのでもしかしたらレビューはもう少し後になるかもしれません。いつも陰ながら応援していた貴ブログというのもあり、レビューの約束は確実にしますので気長にお待ちいただければと思います!!

ktakayamaktakayama2008/12/03 19:49ありがとうございますありがとうございます><
そんな風に言って頂けるなんて光栄です。
ちゃんと届いてる事がわかったので安心しました。
順番待ちは気になりませんから、ゆっくりしてもらって平気です。

トラックバック - http://iphone-dev.g.hatena.ne.jp/ktakayama/20081203