ScrollView の縦スクロールを禁止!
昨日の記事で書いたようにScrollViewの上にTableViewのせた状態で、そのTableRow中にTextField等を乗せる。
そのTextFieldをクリックすると、入力のためのキーボードが表示されるのですが、TextFieldがキーボード表示により隠れる位置にあるとスクロールされます。
このスクロールが、ScrollViewとTableView両方に対して行われるんですが、ScrollViewは縦方向に動いてほしくないので、縦スクロールを禁止するScrollViewをModuleで作ってみました。
TiUIScrollView クラスの継承した HogeProjScrollView クラスと、
TiUITableViewProxy を継承した HogeProjScrollViewProxy クラスを新たに作成して、
HogeProjScrollView.m にスクロール発生時に呼ばれるメソッドの scrollViewDidScroll をオーバーライドします。
もしyの値が変わっている場合は、yの値を0としてProxyのscrollViewDidScrollをコールするように置き換えたらできました。
- (void)scrollViewDidScroll:(UIScrollView *)scrollView_ // any offset changes { if(scrollView_.contentOffset.y != 0){ CGPoint newOffset = CGPointMake(scrollView_.contentOffset.x, 0); scrollView_.contentOffset = newOffset; } [(id<UIScrollViewDelegate>)[self proxy] scrollViewDidScroll:scrollView_]; }
こんなんでいいんですかねぇw
TableViewを2枚並べると…ステータスバーのタップが…
今、ScrollViewを左右に2枚ならべて、各ScrollViewにそれぞれTableViewを配置し、
左右の領域それぞれが縦横とスクロールできる感じの画面を作っております。
各ScrollViewが横スクロール担当で、TableViewが縦スクロール担当。
で、各TableViewは同期して縦スクロールする仕様となってます。
(すでにiPadの動きではない感じなので、はじかれないか心配ですが、要望なので…)
なんとか上手く行っていたのですが、なにげにステータスバーをタップしたら、
TableViewが先頭に移動するではないですか!w
iPad初心者の僕は上記挙動を初めて知ったのですが…。
そして悲惨な事に、スクロールバーをタップすると、まず右のTableView が先頭に移動。
次にタップすると、左のTableViewが先頭に移動する現象が…
左右のTableViewは"scroll"イベントで同期をとっていたのですが、
この操作、scroll イベントを発生しないのです…orz
そこで先日日記にかいた、TiUITableViewを拡張する必要が出てきた訳です。
拡張したModuleで、スクロールバーがタップされた場合、とりあえず無効にして、独自イベントをTableViewに渡す拡張をしました。
先日作った、HogeProjHogeClassViewに、ステータスバーのタップがされた時に呼ばれるメソッドをオーバーライドします。
呼ばれたら、scrollToTopというイベントを通知しているだけです。
- (BOOL)scrollViewShouldScrollToTop:(UIScrollView *)scrollView { if ([self.proxy _hasListeners:@"scrollToTop"]) { [self.proxy fireEvent:@"scrollToTop" withObject:nill]; } return NO; }
return NOとする事で、ScrollTopはおこらないみたいです。
で、Titanium 側でイベントを受けたら、各TableViewをTopへ移動すれば、なんとかステータスバーのタップっぽい動きができました♩
rtableview.addEventListener('scrollToTop', function(){ rtableview.scrollToTop(0, {animated:true}); ltableview.scrollToTop(0, {animated:true}); });
iOSのデフォルトの動きをわからずに開発するのは無謀なのを学びましたw
TiUITableView を拡張〜
TiUITableView クラスの継承した HogeProjHogeClassView クラスと、
TiUITableViewProxy を継承した HogeProjHogeClassViewProxy クラスが必要でした。
HogeProjHogeClassViewProxyは、デフォルトでTiProxyクラスを継承しているけど、
そこを、TiUITableViewProxyにしてあげないと、実行時に落ちました!
ViewProxy クラスが Titaniumとのインターフェース?みたいなので
TableViewと同じ挙動したければそこも継承しなくちゃなんか…。
これで正しいかわからないけど、今のところ大丈夫っぽい♩
んで、これにかなりハマってしまったのでしたw
Titanium Mobaile の Moduleが…
昨日、SDKだけを2.0.1.GAに更新したときは、
以前作成したモジュールも読み込まれて動作してたんですが…
今日、Studioを2.0.1に変えて、SDKもGA2に変えて、
シミュレータで動かしたら、not found で動かない…。
ってか、ログに「Detected …」って出ないし。
新しいTiapp.xmlのGUI画面では認識してるんだけどね〜。
新しいSDKで再構築がいるのかしら?と思い色々試したんだけどやっぱりだめでした。
今のStudioはmoduleのプロジェクトも作れるみたいなので、
#前はコマンドラインでやるやつでした。
Appceleratorのドキュメントみながら、再度プロジェクトから作成し直したら、
[Detected…」と出るようになって、実行できるようになりました♩
でもTiapp.xml のGUIでは「module is not Supported …」とか警告が出ているんだけど、なんか動きました。
んで、実機転送まで完了できました。
でも何かしらおかしいんだろうな…もうちょっと調べてみよう。
Titanium Studio 2.0.1 にアップデートしたら…
初書き込みです☆ぼちぼちやってきま〜す。
昨日の帰宅するまえに、Titanium Mobile の2.0.1.GAがリリースされているのを発見して、今開発中のアプリを一通り動作させてかえりました。今日出社してAppceleratorのHPを確認したら、Studioも2.0.1がリリースされていました♩
なので早速更新してみたのですが…
Alert
エラーが発生しました。ログ・ファイル
/Applications/Titanium Studio/config
というメッセージがでて起動しない…
ログとかみたけどよくわかんないしぃ
僕は英語苦手なので、前のバージョンでもPleiadesを使って日本語化してたのですが、これかな〜って思い、TitaniumStudio.iniからPleiadesの設定を削除!…したら無事動きました♩
でも英語のままだと困るので…w
Pleiadesの設定消して〜ってことは、Pleiadesの設定かなんかかな〜とか思い、フォルだ構成とかいじってみたり、Eclipseの設定かな〜と-Xmsとかの設定とかいじってもだめで、もうだめかな〜あきらめかけた時にひらめきました!
clean起動してないじゃん。
clean起動したらすんなり動きましたとさ。めでたしめでたし。そして朝からぐったりw
これから色々いじってみます♩