トラねこblog

価格比較サイト「coneco.net」Travel.jpを運営しているベンチャーリパブリックの開発者Blog @ 西麻布

[iPhoneアプリ]UITableViewのスクロールを滑らかにする

こんにちは、豪(たけし)です。

UITableViewでの縦スクロールが妙に重いケース、良くありますね。
今回はHotel.jpのiPhoneアプリで縦スクロールをスムーズに高速に動かすために
行っていることをご紹介します。

Hotel.jpアプリのホテルの検索結果画面では、1つのセルの中にテキストラベルが
15個+画像2つ、しかもテキストラベル14個は画面左のタブを押すと横移動も
するといういかにも重そうなインターフェースなのですが、iPhone4であれば
スムーズに縦スクロールします。

検索結果画面
search_result


動画(30~40秒目が検索結果画面です)


ここ苦労したんです・・・。実装方法をざっとお話します。

最初は楽をしてやろうとUITableViewCellのNibを作ったのですが、
1つのセルにUILabelを15個並べて更に横に移動するようにすると
もうスクロールと呼べないコマ送りのような動きになりました。

そこで、Nibを使わないようにしたのですが、普通にUITableViewCellに
UILabelをaddSubviewしていくとまだスクロールが遅い。
そこで調べてわかったのは、必要な文字だけUITableViewCellに描き
こんでしまえば早くなるという原理でした。

 UITableViewCellにUILabelとかのっけるから重くなるんです。
 (本来のせても軽快にスクロールするのがベストですが)

参考にしたサイトがいくつかあるのでそれと一緒に説明します。

まず、1つ目

Apple TableViewSuite sample

このコード中の5_CustomTableViewCellを参考にしています。
実はこれ、AppleがオリジナルではなくTweetieの作者が考案した
ものをAppleがパクった参考にした(英語)
ようです。

このソースコード長いですね。知っておけば役に立ちますが、
ここでは以下の部分を知っておけばいいです。

ファイル:5_CustomTableViewCell/Classes/TimeZoneWrapper.m

static UIImage *q1Image;
static UIImage *q2Image;
static UIImage *q3Image;
static UIImage *q4Image;

<省略>
+ (void)initialize {
// Unlikely to have any subclasses, but check class nevertheless.
if (self == [TimeZoneWrapper class]) {
<省略>
q1Image = [[UIImage imageNamed:@"12-6AM.png"] retain];
q2Image = [[UIImage imageNamed:@"6-12AM.png"] retain];
q3Image = [[UIImage imageNamed:@"12-6PM.png"] retain];
q4Image = [[UIImage imageNamed:@"6-12PM.png"] retain];
}
}


予めstaticで必要な部品を持たせておいて、セルを表示するときに何度も
再利用しています。[UIImage alloc] init]ではなく[UIImage imageNamed]を
使っている部分はimageNamedのキャッシュを効かせたいからなのでしょうか?
(キャッシュが効くならstaticで持たせる必要がそもそもないのかも?
試していませんが、確実な方法として私はstaticを使って書いています。)

二つ目

先ほども出たTweetieの作者のページにある
ABTableViewCell(FastScrolling.zip内)なのですが、どうもファイルがDLできないですね・・・

下のブログでサンプルプロジェクトに同じものが使われているのでダウンロードしてみて下さい。(リンクに修正版と書かれている方です)
[iPhone] テーブルのスクロールが遅いので高速化に挑戦中(苦戦中)


その中のABTableViewCellとFastTableViewCellの動きを全て把握して下さい。
これが要です。

簡単に言うとこんなイメージ。

 通常
  ・UITableViewCellにUILabelのインスタンスを置いて、そのtextプロパティに値を入れておく。

 改善版
  ・UILabelを使わず、drawRectメソッドが呼び出されたら鉛筆を持たせて、セルに文字を書けと指示を出す。

このFastTableViewCellを使うだけで相当滑らかに動くのですが、先ほどのTimeZoneWrapper.mで
staticを使ったインスタンスを保持しておく方法をプラスすれば、スクロールが更に滑らかになり、
スクロール中の引っ掛かりが軽減されます。

Hotel.jpアプリのTableViewCellは横移動もするので、実際にはABTableViewCellも
FastTableViewCellも使わず0から作っています)

ちなみに、ABTableViewCellについて追加でこちらの人がコメント(英語)してますが、
まとめると、以下の2点をすると良いそうです。

 ・initWithFrameではなくinitWithStyleを使う
 ・tableView:cellForRowAtIndexPath:のメソッドのreturn cellの直前に[cell setNeedsDisplay]の1行を追加する

三つ目

ホテル写真部分はLazy loadingさせています。読み込み開始の
タイミングなどまだ改善の余地があるのですが、これをしていないUITableView
はあまり見ないので、ここでは割愛。

四つ目

tableView:cellForRowAtIndexPath:の中で行われる処理が軽いほど滑らかにスクロールします。
そのため、事前に実行できる処理はやっておくのが良いでしょう。

Hotel.jpアプリのホテル検索結果のページでは各ホテルへの現在地からの距離が表示されています。
この部分はセルが表示される時ではなく、事前に距離計算され、文字列化
されたものを保持しています。そのため、tableView:cellForRowAtIndexPath:が
呼び出された時は、その文字をセルに描くだけで良い状態になっています。

最後に

透過性のビューを使わないようにするなど、その他にも少しだけ技があります(ただし、あまり大きな効果は期待できません)。
以下を参考にして下さい。

[iOS] TableView スクロールパフォーマンスの改善

[iPhone] テーブルのスクロールが遅いので高速化に挑戦中(苦戦中)

iPhoneアプリ開発をする方は最初にぶつかる(ぶつかった!)壁かと
思うので、一助になれば嬉しいです!

[xcode]メソッド名付きのデバッグログを出力

こんにちは、豪(たけし)です。

ちょいと宣伝!
Hotel.jpから待望のiPhoneアプリが出ましたここを押してダウンロードしてね

アプリの開発中、実行中のメソッド名をログに書き出していくことで、
エラーが特定しやすくなったり、アプリの動きが把握しやすくなったり
Appleがドキュメントで説明していなくて、もうどうしようもなく
はまった時のアプリの動きが確認しやすくなったり
します。

やり方は簡単、.pchファイルで以下のマクロを定義しておけばOK。

#ifdef DEBUG
# define DLOG(__objects__...) NSLog(@"%s [Line %d] %@", __PRETTY_FUNCTION__, __LINE__, ((__objects__)? [NSString stringWithFormat:__objects__] : @""));
#else
# define DLOG
#endif



これで
・デバッグ時のみログを出力
・ログを出力したメソッド名を出力
・ログに行番号も一緒に出力
・NSLog同様、引数に渡した文字列をログに出力

(使い方)
メソッド中に以下のように書いて下さい。

DLOG(@"");
DLOG(@"test comment");
DLOG(@"%@", aStringVariable); //aStringVariableはNSStringのインスタンス


↓こんな風に出ます

-[AAAViewController dealloc] [Line 52]
-[AAAViewController viewDidLoad] [Line 52] test comment



(参考)
↓を参考にしています。(XCode4で↓の通りにやるとC99にしてとエラーが出る・・・)
http://iphoneincubator.com/blog/debugging/the-evolution-of-a-replacement-for-nslog

Debugで実行してもログ書き込まれないよーって方は↓
http://d.hatena.ne.jp/paraches/20100619/1276971406

list_index.js 50音索引生成Javascriptライブラリ

brand
すっかりご無沙汰しております。kuwaです。

list_index.js 50音索引生成Javascriptライブラリを公開致します。

以下、配布ページから引用した本ライブラリの特徴です。
  • JSON形式のリストを元に、50音索引とリストを生成、表示します。
  • 「ア・カ・サ・タ・ナ・・・」で絞り込んだ後「ア・イ・ウ・エ・オ」でさらに絞り込めます。
  • jQuery依存です。
  • Ajax等であとから項目を追加できます。
  • 画面内に複数設置可能。独立して動作します。
  • 「ヴァ・ヴィ・ヴ・ヴェ・ヴォ」は「バ・ビ・ブ・ベ・ボ」に対応し、「ア行」と「ハ行」の両方に表示されます。
  • 見た目は全てcssで制御。

coneco.netのファッションカテゴリで、ブランドによる絞り込み機能があるのですが、数百のブランドを効率よく選べる方法を提供できないか。というところが開発の背景となります(coneco.netのファッションカテゴリではマウスオーバーでの動作ですが、本ライブラリでは、マウスクリックでの動作になってるなど、多少の差異はあります。)。
左カラムに設置しても邪魔にならず、使い勝手の良い索引を目指しています。
また、デモページでは70件のブランドを索引表示していますが、coneco.netファッションカテゴリでは、最大500件のブランドを索引で絞り込むことができるようになっています。

デモ、およびダウンロードはこちら→「list_index.js 50音索引生成Javascriptライブラリ」

公開するにあたり、もう少しキレイなソースにしたかったところなのですが、あまり時間をかけても他の仕事が滞ってしまいますので、このような形ですみません(変数名とかぐちゃぐちゃだったり、パラメータとかも減らせるはずなんですけどね)。

どうぞご利用ください。

coneco.netの検索をSolrでリニューアル

こんにちは、藤田です。

4/27に、coneco.net(コネコネット)の検索をリニューアルしました。

しばらく前から別ドメインで運用していた商品検索機能を、coneco.net本体に統合した形になります。

リニューアルによって、多くの商品(現在2,200万件ほど)を、高速に検索できるようになりました。今まで「coneco.netの検索は遅い」と敬遠されていた方にも、快適に使っていただけるようになったのではないかと思います。

検索エンジンは、オープンソースの検索エンジンSolrを使っています。
coneco.netで使っているSolrの構成を、少しご紹介します。続きを読む

Twitterのステータスに表示されるfrom の部分を変更5

どうも、kuwaです。

以前作成したTwitterの最安値応答Bot「@yasune」ですが、内部でNet::Twitterモジュールを使用しているため、こんな感じで、「from Perl Net::Twitter」と表示されてしまってちょっと恥ずかしい状態でした。今回ここに「yasune」と表示するようにしました。

fromの部分を変更するには、Twitter側にメールで依頼する必要があるという話をどこかで見ていたので詳しい方法を調べたところ、現在はそうでは無いという事が、以下のサイトでわかりました。親切にも、こちらに設定の手順が掲載されています。

PerlによるWebコンテンツからTwitterに投稿して「from ×××」と表示する方法

ただし、ここに書かれている手順で進めると、一点つまづく部分があります。
STEP2のソースに
my $verifier =;

という部分がありますが、これは実際には

my $verifier = <STDIN>;

になります(HTMLのタグと解釈されてブラウザで見ると表示されないのでしょう)。
ここさえ注意すれば、意外とあっさり設定できます。

設定後のfromはこんな感じになります。
from_yasune

どうぞご利用ください。続きを読む

あけましておめでとうございます

新年あけましておめでとうございます。
本年もさらなるサービスの拡充に努めてまいりますので、
宜しくお願い致します。

MA5ベンチャーリパブリック賞受賞作「Onedaree(おねだりーー)」

以前のエントリーでお伝えした、「Mashup Awards 5」の部門賞が決定しましたので、ここでご紹介します。

ベンチャーリパブリック賞はmishimumさんの「Onedaree(おねだりーー)」に決まりました!

shadow


Onedareeとは?


Onedaree(おねだりーー)は、欲しい!買いたい!と思っている商品についてのレビューや口コミ・評価を探し出して、(奥さんや旦那さん、お父さん・お母さんなどに)おねだりする際に役立つ、データ収集のお手伝いをするサービスです。


とのことです。


さっそく私も使ってみました。

iMac 24インチ 2.93GHz MB419J/A をおねだりします。


新しい・・・iMacが・・・欲しいっ・・・ですっ><

もっと情熱を注入すれば、さらにいいおねだり資料が作れると思いますが、とりあえず…。
conecoクラブのレビューが載っているところもいいですねー。これでこの商品のいい点が自分以外からアピールできるので、おねだり度さらにUPです。

細かい突っ込みどころはいっぱいあったりしますが、それよりも「conecoとは違った視点での商品の購入支援の方法」という点に注目して今回の受賞となりました。
ぜひとも、「よくレビューを見たり、価格を見たりはするんだけど、結局サイフは嫁がにぎってるんだよなぁ…」とか、「すごいこの商品が欲しいんだけど、今は買えないので、このモチベーションをどこかに書き連ねておきたい!」などというときに使ってみて頂けると、こちらもうれしいです。



尚、副賞ですが、
conecoオリジナルタンブラー
・Onedareeで5万円以下の商品をconecoにおねだりできる権
を進呈させて頂きました。

授賞式会場では、部門賞受賞作の作品紹介はなかったので、「おねだりできる権!を進呈します〜」と司会の人から副賞発表があった際に「???」となっていた人も多かったのですが、せっかく作って頂いたおねだりツールなので、conecoにおねだりして貰ったら話題性があるんじゃね?という所からこのような副賞になった次第です。


今回「Mashup Awards 5」で初めてconecoが参加でしたが、いい作品に巡り会えて参加して良かったな、と思っています。
ただ、MA5参加総数(346作品)から比べて、まだまだconecoAPI仕様作品が少なかったのが残念な点ではあったので、今後さらにconecoそのものも皆さんに知って頂けるようにしていきたいです。

来年も「Mashup Award 6」があれば、是非ともconeco(+Travel.jp?)も参加しますので、よろしくお願いします!

簡単なGoogle Chromeの拡張を作ってみる その2 (Coneco Twitters)

簡単なGoogle Chromeの拡張を作ってみる その1
からしばらく間があいてしまいましたが、こんにちは。藤田です。

前回はContent Scriptsを使って、キーボードを押すと時計を表示するというシンプルな拡張を作りました。

今回はBrowser Actionsという機能を使って、拡張を作ってみたいと思います。

coneco.netには、coneco.netの様々な情報を軽快につぶやいているconeconet、商品名を投げかけると安値を教えてくれるyasune、コネコクラブのレビューをつぶやくconecoclubなどのtwitterアカウントがあります。

今回の拡張は、そんなconeco.netに関わるTwitterをポップアップで簡単に閲覧してしまおうというものです。

完成図はこんな感じです。

coneco_twitters



アドレスバーの横のアイコンを押すと、ポップアップでTwitterの投稿が表示されます。
ポップアップの中のアイコンを表示するたびにユーザーが切り替わります。

この拡張は閲覧するだけですが、少し応用すれば投稿も可能な、とても使い勝手の良いTwitterクライアントが、比較的手軽にできるのではないかと思います。

それでは、作ってみます。続きを読む

簡単なGoogle Chromeの拡張を作ってみる その1(Simple Clock)

こんにちは。藤田です。

普段メインで使うブラウザはFirefoxだったのですが、しばらく前からGoogle Chromeをメインで使うようになりました。高速な動作や起動の速さに加え、開発版で拡張機能(Extensions)が使えるようになったのが大きいです。MacやUbuntuのマシンにも入れていますが、Windowsと同じように十分実用的に使えます。

既に便利な拡張もいくつも作られていますが、やはりFirefoxに比べるとまだまだ足りません。
足りないものは自分で作ってしまえるようになろう!ということで、まずは簡単な拡張を作ることで作り方を覚えることにします。

Chromeの拡張はHTMLとJavaScriptで作りますので、HTMLやJavaScriptの基礎的な知識があれば、結構手軽に作れるのではないかと思います。

それでは、早速作ってみます。続きを読む

「Mashup Awards 5」にconeco.netもAPI提供企業として参加しました!

現在開催中の「Mashup Awards 5」に、今回よりconeco.netのAPIも参加しています。

最優秀賞以外にも、それぞれ各社様ごとのAPIを使ったサービスへの部門賞など、いろいろな賞もあるようですので、この機会に振るって参加してみてはいかがでしょうか!?

#もちろん、conecoの部門賞も予定しています!


開催概要は次の通りです。
MA5_Banner_170_70
────────────────────────
・名称: Mashup Awards 5 (MA5)
・主催: Mashup Awards 実行委員会
・作品応募期間: 2009年9月25日(金)〜11月4日(水)
・授賞式: 2009年11月29日(日) (最終選考会後に表彰)
・最優秀賞・賞金: 100万円 (そのほか計約50賞)
・公式サイト: http://mashupaward.jp/
・公式ハッシュタグ: #MA5
・応募方法: 参加協力企業・団体が提供するAPI・リソースのうち、
少なくとも1つを利用した作品を制作して、ご応募ください。
────────────────────────

それでは、coneco.net Web Servicesを使った、新しくて楽しくなるサービスを期待しています!
coneco.net人気ランキング
Profile
QRコード
QRコード
trackfeed

track feed

  • ライブドアブログ