この件、前々から原因がわからずハマっていたのですが、暫定的な対処法がわかりました。
Groupedなテーブルというのは、テーブルのstyleがUITableViewStyleGroupedのテーブルのことで、こんな画面のことです。

このようなGroupedな画面でスクロールさせると、アニメーションがコマ落ちしているような動きになっていました。
はじめはスクロールの際にセルの再利用が効いていないのかとか、セルの背景色が透明になっているのかとか、パフォーマンスに影響が出そうな線で調べていたのですが、特にこれといって問題はみつからず。
試しにIBでstyleをplainへ変更してみたら、スクロールがスムーズになったので、Groupedなテーブルではスクロールが重くなってしまうのか、と一旦この問題放置していました。
ですが、iphoneにデフォルトでインストールされている電話帳アプリの詳細画面も同じようなGroupedなテーブルで作っているように見えるので、やはり何か方法が絶対あるぞと、思いつきでIBでビューを生成していたところを、コードでビューを生成するように置き換えてみました。
こんなコードです。
- (void)loadView {
CGRect frame = [[UIScreen mainScreen] applicationFrame];
UIView *view = [[UIView alloc] initWithFrame:frame];
view.autoresizesSubviews = YES;
self.view = view;
[view release];
UITableView *tv = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, self.view.bounds.size.height) style:UITableViewStyleGrouped];
tv.delegate = self;
tv.dataSource = self;
tv.allowsSelectionDuringEditing = YES;
self.tableView = tv;
[self.view addSubview:tv];
[tv release];
} |
するとスムーズなスクロールになりました。
このコントローラはUIViewControllerを使っていて、ViewにUITableViewをaddするようにしています。
試しに、コントローラをUITableViewControllerに変えてinitWIthStyleでGroupedを指定したところ、こちらもスムーズなスクロールになりました。
ただし、loadViewでビューを初期化すると、didReceiveMemoryWarningが頻発するようになってしまいました。
IBでビューを作成する場合よりも、loadViewでビューを作成する場合の方がメモリを食ってしまうのでしょうか。
これまではIBで用意した1つのビューを詳細画面や集計画面などの初期化時に流用していたので、消費されるメモリが少なかったということなのだろうか。
ひとまず暫定対応として、詳細画面や集計画面など画面のスクロールが必要ない画面は、IBで作成したビューでスクロールをOffにして外見上コマ落ちが発生しないようにして、スクロールが必要な画面だけをloadViewで書くようにしました。
ん〜なぜIBで作るとコマ落ちするのか原因がはっきりしていないので、気持ち悪い。
関連のあるアプリ
タグ: iphone, iSlot, iSlot Pro, objecti, objective-c, UITableView, UIViewController, アプリ, セル, パチスロ, リリース, 収支, 対処法


