Work Records

日々の作業記録です。ソフトウェアエンジニアリング全般から、趣味の話まで。

titanium mobile scrollviewのscrollendがなんだかイマイチ

全部読み込むと1ページに収まらないviewを作りたい場合、
scrollviewを使うんですが、
scrollview作成時にコンテンツを一気に作成してしまうと処理が固まってしまうので、
分割して、現在表示されているコンテンツがスクロールされて最後まで表示されたら
次のコンテンツを追加、表示みたいな事をしたくなりました。
(要するに良くある遅延ローディング)

で、ドキュメント見た感じscrollendが使えそうだったんだけど、ちょっと思ってたのとちがいました。。。
Appcelerator Documentation

scrollview.addEventListener('scrollend', function(){
    // add contents
});


想定していた動き

  • スクロールしてviewの最下部まできたらイベント発生

実際の動き

  • スクロールしてviewの最下部まできたらイベント発生
  • スクロールしてviewの最上部まできたらイベント発生
  • スクロールして手を離す、viewの動きが徐々に減速して止まったタイミングでイベント発生

特に、3つめは、viewの位置は関係ないみたい。

なので、想定していた動きを予想してscrollviewと使うと
下までスクロールしていないのに、知らないうちにどんどんとコンテンツが追加されてしまって、あれれ?となる。


てことで、苦肉の策としてcontentOffsetというプロパティを使用しました。

scrollview.addEventListener('scrollend', function(){
    if ( this.contentOffset.y > CurrentScrolledHeight ) {
        // add contents
    }
});

CurrentScrolledHeightはいまスクロールしたコンテンツの長さ。
直接導出する方法が分からなかったので、中のコンテンツの高さを足し合わせて計算しました。

要するにやっている事は、scrollendが検知されたときに、
viewの最下部まで来ている場合だけイベントを発火させる、という処理です。

ちょっと面倒でしたが、ひとまずこれで問題解決。


ちなみに、いままでscrollEndだったのが小文字になってscrollendになったみたいです。

[asin:4798123986:detail]


自作アプリ紹介コーナー
https://itunes.apple.com/jp/app/tokimekiekisupuresustation/id660044163?mt=8
f:id:kenjiszk:20130706222734p:plain