2013年3月24日日曜日

便利なアイコンフォントをiOSアプリで使う方法メモ

アイコンっていうのはデザイン上とても大事なんですけど、自分で用意するのはけっこう面倒です。
なので世の中の優れたデザイナーさんが作ってくれたアイコンを使わせてもうらうことが多いのですが、アイコンフォントを使うとそれなりにメリットがあるなあと思ったのでメモしておきます。


個人的に気に入ってるピクトグラムのセットを配布しているサイトです。
(ライセンスはCC BY 3.0 フォントはSIL Open Font License)

こちらからパッケージをダウンロードします。


フォントファイルだけではなくpsdやpdf、Webフォントに使えるsvgファイルまで入ってます。

今回はDesktop Typefaceに入っている Entypo.otfを取り出して、目的のiOSアプリのプロジェクトに投入します。



Entypo.otfをプロジェクトに追加したら、プロパティのFonts provided by applicationにEntypo.otfを追加します。
(Fonts provided by applicationがプロパティのリストにない場合は追加)


これでアイコンフォントを使う準備が整いました。

あとはUIButtonなどのフォント設定に"Entypo"を指定すれば使えます... と言いたいところなのですが、Entypoの場合は文字をUnicodeで指定する必要があるのでちょっとひと手間必要です。


さきほどダウンロードしたパッケージにGlyph guideline.rtf というドキュメントがあるので開くとアイコンとUnicodeの対応を調べることができます。

例えば電話マークを使いたい時
char name[] = "\u1F4DE";
NSData *telData = [NSData dataWithBytes:name length:strlen(name)];
NSString *telString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
button.titleLabel.font = [UIFont fontWithName:@"Entypo" fontSize:14.f];
[button setTitle:telString  forState:UIControlStateNormal];
あくまでもフォントなので、色や大きさを好きなように変え放題です。
iPhoneとiPadで異なるサイズのアイコンが必要な時や、状態によって違う色のアイコンを複数用意する場合などに重宝しそうです。

2013年3月15日金曜日

#iOS 外部キーボード使用時にUIKeyboardなんちゃらの通知が 飛んでこないという話

先日拙作アプリの文字入力周りを変更したら思わぬ不具合報告があったのでメモしておきます。


UITextFieldやUITextViewが入力状態になった時(First Responderになった時)、通常はiOSのソフトウェアキーボードが画面に表示されるタイミングでUIKeyboardWillShowUIKeyboardDidShowといった通知が飛んできます。

ところが、外部キーボードを使用しているときはこれらの通知が飛んできません

なので例えばUIKeyboardWillShowの通知で入力状態の初期化などを行っている場合はまずいことになります。
日本語のソフトキーボードだとキーボードの高さが変わったりするので、特に日本の開発者さんなんかはこのあたりでけっこう色々やってることが多いのではないでしょうか。

ややこしいのはUITextFieldやUITextViewのinputAccessoryViewにViewを指定してるとちゃんと通知が飛んでくるらしいのですよね。

外部キーボードが使用されることを想定して、例えばUITextViewだったらtextViewDidBeginEditing:などで処理を行うのがよさそうです。



外部キーボード持ってないよという方はアプリを使えばMacとiOSデバイスをBluetoothでつないでMacを外部キーボード化できます。

iKeyboard
http://appstore.com/mac/ikeyboard

Type2Phone
http://itunes.com/mac/type2phone


参考:
How can I detect if an external keyboard is present on an iPad?
http://stackoverflow.com/questions/2893267/how-can-i-detect-if-an-external-keyboard-is-present-on-an-ipad