かみやんの技術者ブログ

主にプログラムの話です

Apple Mail.appのようなUI

ver.1.0までは私はコーディングしていなかったのですが、最近iPhoneのコーディングをしています。
ibisMail for iPhoneの開発中に、何度もプログラマから「OSの仕様かバグか分かりませんが、○○が動きません」という報告が上がっていた。その度にAPIリファレンスを調べたり、仕様を変更したりしてきました。メッセージ本文画面とメッセージ作成画面は、3回ぐらいプログラマも作りなおしてくれてギリギリ形になったというところでした。
中でも私が一番気になっていたのは、メッセージ本文画面のスクロール速度。
最近、自分でメッセージ本文画面を改良してスクロールを高速化しました。ついでに上下矢印によるメッセージの切り替え速度、本体回転による画面回転処理の高速化、メモリ効率の改善。かなり快適になりました。本当は、開発中バージョンとver.1.2.0とApple Mail.appとの速度比較をビデオに撮りたいところですが、普段のメールを撮影すると個人情報ダダ漏れ、企業秘密ダダ漏れになってしまうので、撮影用のダミーメールを用意しないといけないのでちょっと面倒。
メッセージ作成画面も改良したのですが、OSのバグとAPI不足で八方塞がりで仕様を変更しました。iPhone手ごわいです。

OS2.2と2.2.1と3.0で同じバイナリでも実行結果が違うので、あの手この手を考えて実装してもあっちのOSではうまく動くが、こっちでは動かないなど多発。基本的には、OS2.2、2.2.1、3.0へとOSのバグは減っているが、時にはOS3.0よなんでこう変えてしまったのか?!とかもある(OS3.0についてはNDAの中なので何も話せないが)

スクロールビューの中のスクロールビュー問題

まず基本的にUIScrollViewの中にUITextViewやUIWebViewを入れたり、UITableViewのセルの中にUITextViewやUIWebViewを入れると、虫眼鏡が動かなかったり、scroll-to-topジェスチャー(ステータスバータップでビューの先頭に戻る)が効かなかったり、OS2.2.1以下では再描画されなかったり、OS3.0の○○が○○だったりで、うまく行きません。このスクロール機能があるビューの中にスクロール機能があるビューを入れると動作がおかしい問題は、他のアプリもいろいろ購入して調べましたが他のアプリも問題を抱えているようです。iPhone Developer CenterのForumでも解決する手段がみつかっていないようです。
結局、スクロールビュー系にスクロールビュー系を入れるのはよくないということで、スクロールビュー系は1個にするように書きなおしました。でも、中にUITextFieldを入れて、ちょっと素早くドラッグするとOS2.2のときにフレームワークライブラリの中でAssertで落ちる問題にぶつかり何ともなりませんでした(ReleaseビルドでもAssertで落ちる)。手ごわいです。

UIWebViewの問題

スクロールする系のビューとしては、UIScrollViewとUITableViewとUITextViewとUIWebViewの4つですが、なぜかUIWebViewだけUIScrollViewのサブクラスではなく、UIWebViewのサブビューとしてUIScrollerという非公開クラスを持っています。おかげでスクロールのビュー位置とかを制御するのが困難です。他にもUIScrollViewのサブクラス(または、サブビューとしてUIScrollViewを持つ)なら、あれもできる、これもできるのに。というのが多々あります。

APIの少なさ

普通のOSなら、テキストビューがあれば、カーソル位置からビュー座標系への変換とその逆のビュー座標系からカーソル位置を求めるとかあるのですが、現状のiPhone OSのフレームワークライブラリにはありません。虫眼鏡が出ているかどうかも取得できません。OSのバグじゃない?というときにこういう細かい制御ができないので回避が困難になっています。

ソース非公開

MFCを初めて触ったときとかも、普通のUIを作る時はさくさく作れてもちょっと外れたUIを作ろうと思うとはまることがありましたが、ソースが公開されているのでフレームワークライブライの中のソースも追っていけばなんとかなりました。が、iPhoneフレームワークライブラリは現状非公開で、中で何が行われているか不明で、解決できる問題かできない問題かも判別がむずかしい。Java.net frameworkは素直であまりはまったことはないですが、Javaに関してはソースが公開されているので追うことも可能です。

さいごに

ま、iPhone開発の苦労は多々ありますが、Objective-Cの言語設計もかっこいいし、iPhoneフレームワークライブラリの設計も奇麗だし、誰でも簡単に奇麗なアニメーションがついたUIが作れるし、UIすべてがグラフィックアクセラレータの恩恵を受けるし、iアプリなどと違って自由にTCP/IP接続ができるし、GPSも使えるし、カメラも使えて、かなり楽しい環境です。
あと、やっぱり高速化は私にとっては最高に楽しい作業です。

#ibisMail for iPhoneで接続設定が分からない方は製品ページ>サポートまで連絡ください。サポートとのやりとりでみなさん送受信できるようになっています。(ただし、NTLM認証は非対応です)