24/7 twenty-four seven

iOS/OS X application programing topics.

Objective-C

アプリケーションを iPhone 4 の Retina Display に対応するための方法いろいろ

iPhone 4 の Retina Display の高解像度表示にアプリケーションを対応させるための方法をいくつか書きます。 これだけですべての場面に対応できるわけではないですが(例えば OpenGL での描画など)何かの役に立てばと思います。 高解像度の画像リソースを用…

iOS 4 のバックグラウンドタスク (Task completion) の制限時間は 10 分

下記のコードで確認。適当コードなのでマネしてはいけません。 - (void)onTimer:(id)timer { NSLog(@"Time remaining: %g", [[UIApplication sharedApplication] backgroundTimeRemaining]); } - (void)applicationDidEnterBackground:(UIApplication *)appl…

iOS 4 のマルチタスキングサービスの種類

適当訳です。 詳しくは WWDC 2010 のセッション 105「Adopting Multitasking on iPhone OS, Part 1」を見ましょう。 Fast app switching 高速な復帰と状態の保存。 Push notifications リモートサーバから通知を送ることができる。(iPhone OS 3.0 から存在) …

iOS 4.0 と iPhone OS 3.x の両方で動作するアプリケーションをビルドする設定

ベース SDK と Deployment Target を設定する ベース SDK を iPhone デバイス 4.0 にします (iPad の場合は 3.2)。 iPhone OS Deployment Target をサポートする OS の最も低いバージョンにします。 (下の場合は iPhone 3.0 以降で動作する。) ベース SDK …

グラフィックスコンテキストに影を設定する CGContextSetShadow 関数の挙動が変わっている

以前に「UILabelに影をつける - 24/7 twenty-four seven」という記事で紹介した CGContextSetShadow 関数の挙動が iPhone OS 3.2 (iPad と iOS 4.0) から変わっています。 具体的には影の付く方向が逆になりました。なので、以前の記事をコードをそのまま実…

座標の指定が整数値でない場合 UIKit の描画(ビュー、画像、ボタン、その他いろいろ)がぼやける

iPhone および iPad で開発をしているとき、たまに画像や文字がぼやけてしまう現象にあったことはないでしょうか。 同じ画像を表示していても特定の場合だけぼやけるとかそういう場合は、だいたい座標の指定が小数になってしまっていることが原因です。 この…

「そのまま使える iPhone アプリプログラム」発売開始

「そのまま使える iPhone アプリプログラム」が発売されました。 サンプルコードも昨日からダウンロード可能になっています。 こちらのサンプルコードはすべて Xcode プロジェクトの形式になっており、タイトルどおり「そのまま使える」形で付属します。 そ…

ビュー (UIView) の階層構造をダンプする非公開の便利メソッド

標準 SDK で提供されているクラスがどういう構造になってるか参考にしたいとか、ちょっとしたカスタマイズをしたいとか、そういうときにビュー構造をダンプしたりすることはよくあると思います。下記のようなメソッドを書いてもいいのですが、実は UIView に…

UISegmentedControl の隠し API

UISegmentedControl は segmentedControlStyle プロパティに 値を直接指定すると、非公開のスタイルを使用することができます。試しに 3 を指定してみると次のようなスタイルになりました。 UISegmentedControl *segmentedControl = [[UISegmentedControl al…

iPhone 開発本「そのまま使える iPhone アプリプログラム」を書きました

「そのまま使える iPhone アプリプログラム」というプログラミング本を執筆しました。「国破れて山河あり」「ソングサマナー」などで有名な Seasons さんとの共著です。 この本ではOpenGL と UIKit について、ちょっと進んだ応用レベルの使い方を解説してい…

delegate オブジェクトは retain すべきではない

Delegating objects do not (and should not) retain their delegates. However, clients of delegating objects (applications, usually) are responsible for ensuring that their delegates are around to receive delegation messages. To do this, they…

UITableView で メール.app のような複数選択を実現する Undocumented API

UITableView の複数セルの選択は、実は Undocumented API として存在しています。 実装してもそれほど手間ではありませんし、審査に通るかどうかも不明なので、今のところ使いどころはないかもしれませんが、紹介します。 UITableViewDelegate に設定したク…

UIButton の隠し API

UIButton も buttonWithType: メソッドの引数に 100 以上の値を直接指定すると、非公開のボタンタイプを使用することができます。 100 〜 102: ナビゲーションバーのボタン (UINavigationButton) 100, 101, 102 を指定すると、ナビゲーションバーで使われて…

ツールバーのボタン (UIBarButtonItem) の隠し API

@iphone_dev_jp ツールバーとかタブバーによくある「現在地を表示」のボタン画像(あのライフルのスコープみたいなアイコンの)はシステム標準でないですよね。自分で作らないとダメなんですかね。 takoyaki0330 on Twitter: "@iphone_dev_jp ツールバーとか…

NSDictionary の objectForKey: と valueForKey: の違い

objectForKey: は NSDictionary のメソッドですが、 valueForKey: は KVC (Key Value-Coding) 由来のメソッドです。 If key does not start with “@”, invokes objectForKey:. If key does start with “@”, strips the “@” and invokes [super valueForKey:]…

CoreData で SQLite のデバッグログを出力するには

Analyzing Fetch Behavior with SQLite With Mac OS X version 10.4.3 and later, you can use the user default com.apple.CoreData.SQLDebug to log to stderr the actual SQL sent to SQLite. (Note that user default names are case sensitive.) For ex…

Objective-C における可変引数の実装方法

Q: How can I write a method that takes a variable number of arguments, like NSString's +stringWithFormat:? A: Methods that take variable arguments are known as variadic methods.Keep in mind that the implementation of an Objective-C method …

二重解放 (double free) や 解放済みオブジェクトへのアクセス (EXC_BAD_ACCESS) によるクラッシュを Instruments を使って調べる

iPhone アプリケーションのプログラミングでは、メモリ管理に注意する必要があります。 特に解放済みのオブジェクトをさらに解放してしまったり(二重解放)、解放済みのオブジェクトを操作しようとした場合は即座にアプリがクラッシュしてしまいます。 この…

大辞林.app のような UI のサンプル「FlipCardNavigationView」を公開しました。

kishikawakatsumi/FlipCardNavigationView · GitHub 西東京 iPhoneDev 勉強会にて、「PhotoFlipCardView」について、「画像の代わりに普通のビューを使うことはできないか」という指摘がありましたので、作ってみました。 このような画面が作れます。 やはり…

大辞林.app のように反転して拡大するフォトギャラリーのサンプル「PhotoFlipCardView」を公開しました。

kishikawakatsumi/PhotoFlipCardView · GitHub サムネイル画像が、クルッと反転しながらフルサイズの画像に拡大するというエフェクトがおもしろいフォトギャラリーのサンプルを公開しました。 エフェクトはまんま「大辞林.app」からのインスパイヤです。 つ…

NSTimer を使うアプリ(時計、ゲームなど)で Mobclix 広告を利用する場合の注意点

実は審査中の「カラー・ペアーズ」[YouTube]も思いがけないバグを提出後に発見した為、一度自分でリジェクトして提出し直しました。 そのバグとはプレイ中に表示していたmobclix広告から発生するものでした。 どういうバグかというと、このゲームは60秒か…

メインスレッド以外のスレッドから NSNotification で通知する場合

NSNotification の通知は、別スレッドから呼ぶと、そのスレッドで実行されるので、通知を受けて UI を更新するような場合、都合が悪いことがあります。 (UIKit は Thread Safe でないため) そういうときは、下記のようにメインスレッドから通知するといい…

*.js ファイルがリソースバンドルから読み込めない場合は

Xcode はデフォルトで *.js の拡張子を持つファイルは、ソースファイルの扱いになります。 そのため、アプリケーションをビルドしたときに、リソースバンドルに含まれません。 この問題を解決するには、ターゲットを開いて、ビルドのルールを編集します。 上…

UIWebView を使ってリソースバンドル内の HTML ファイルで、外部 JavaScript や CSS を読み込む

UIWebView を使用して、ローカルに存在する HTML ファイルを表示することができます。 そのとき、凝った表示を行う場合、外部 CSS や JavaScript を使用したい場合があると思います。 <html xmlns="http://www.w3.org/1999/xhtml" xmlns:v="urn:schemas-microsoft-com:vml"> </html>

ナビゲーションバーの戻るボタン (backBarButtonItem) の表示を、画像や任意の文字列に変更する

UINavigationController を使った場合に表示される戻るボタンには、前のビューのタイトルが自動的に表示されます。 戻るボタンの表示に画像を使用したり、任意の文字列に変更するには、遷移前のビューコントローラの navigationItem の backBarButtonItem に…

Tweetie 2 のリフレッシュUIサンプル

A similar control to the pull down to refresh control created by atebits in Tweetie 2. enormego/EGOTableViewPullRefresh · GitHub

スポイトツールで拾った色を簡単にコードに変換できるDeveloper Color Picker

Developer Color Picker A custom color picker designed specifically for developers. Makes getting colors out of Photoshop/Acorn mock-ups quick and easy. Currently supports NSColor, UIColor, CGColorRef, CSS and HTML styles. Developer Color P…

libxml2 をリンクしていて、iPhone SDK 3.x でビルド、Deployment Target を iPhone OS 2.x に設定しているとき、OS 2.x の環境で実行するとクラッシュする場合の対処

iPhone SDK 3.x で libxml2 を使うプロジェクトを Deployment Target を iPhone OS 2.x に設定してビルドしたとき、OS 2.x の環境で実行すると、libxml2 のリンクに失敗します。 dyld: Library not loaded: /usr/lib/libxml2.2.dylib Referenced from: /var/…

UITabBarControllerを自動回転に対応させる (2)

UITabBarControllerを自動回転に対応させる - 24/7 twenty-four seven以前UITabBarControllerを継承する方法を書きましたが、各タブの全てのUIViewControllerがshouldAutorotateToInterfaceOrientation:メソッドでYESを返せば回転するようです。 例えば、上…

UILabelに影をつける

UILabelに影をつけるには通常、shadowColorプロパティとshadowOffsetプロパティを設定します。 暗めの背景色で、shadowColorを白、shadowOffsetを下に1ピクセルずらすと、立体感のあるラベルになります。 label.shadowColor = [UIColor whiteColor]; label.s…

スクロール(ドラッグ)中でもタイマーを止めない方法

NSTimerのカウントがUIScrollViewのドラッグ中に止まってしまうのが困る場合は次のようにします。 NSTimer *timer = [NSTimer timerWithTimeInterval:1.0f target:self selector:@selector(onUpdate:) userInfo:nil repeats:YES]; [[NSRunLoop currentRunLoo…

NSObject:description メソッドを簡単に実装できる DescriptionBuilder を公開しました。

kishikawakatsumi/DescriptionBuilder · GitHubNSObject クラスの description メソッドをオーバーライドしておくと、NSLog で出力できたりしてデバッグ時に便利です。 ただ、出力する項目が増えてくると、結構な手間になるので、リフレクションを使って自動…

MapKitでルート案内をするライブラリを公開しました。

MapKitフレームワーク単体では、標準のマップアプリのようなナビは作れないのですが、Google Maps APIと組み合わせることで、似たような機能を実現してみました。 GitHubのリポジトリで公開しています。 kishikawakatsumi/MapKit-Route-Directions · GitHub …

文字列の両端の空白を除去(Trim)する

[text stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];

UIWebViewでBASIC認証のあるページにアクセスする方法

ブラウザアプリのAppStoreレビューでちょくちょく言及されているので調べてみました。 Undocumented APIを使用するので、審査に通るかは微妙です。 そもそもBASIC認証くらいなら、 http://user:password@www.example.com/というURLでアクセスすれば認証でき…

UIImage#imageNamed:は読み込みも描画もUIImage#imageWithContentsOfFile:やそれ以外のメソッドより5〜6倍速い

とあるアプリで大量に画像を使うのでキャッシュしない画像のロードをいろいろ試していたのだけど。 imageNamed:は圧倒的にロードが速いし、何故か描画も速い。下記にあるように、UIImage#imageNamed:はクラッシュするまで画像をキャッシュし続けるみたいなの…

iPhoneの回転をshouldAutorotateToInterfaceOrientation:以外の方法で検知する。

http://iphone.longearth.net/2009/05/10/os30%E3%81%AEshouldautorotateto-interfaceorientation%E3%81%8C%E3%81%8A%E3%81%8B%E3%81%97%E3%81%84%E4%BB%B6 iPhone OS 3.0 - Breaking changes to shouldAutorotateToInterfaceOrientation | blog.sallarp.com…

アスペクト比(縦横比)を保ったまま、画像を拡大縮小する。

iphone - How to scale a UIImageView proportionally? - Stack Overflow @interface UIImage (Extras) - (UIImage *)imageByScalingProportionallyToSize:(CGSize)targetSize; @end; @implementation UIImage (Extras) - (UIImage *)imageByScalingProporti…

CATiledLayerとUIScrollViewを使って、超巨大な画像を表示するサンプル

(参考) 無為空間 |タイルビューの挙動確認用サンプル CATiledLayerとUIScrollViewを組み合わせて、巨大な画像をスムーズにスクロールして表示するサンプルです。 表示する画像はこちらを使用しました。Garden | photo page - everystockphoto 画像の大きさは…

XIBファイルをObjective-Cのソースコードに変換するツール

nib2objc akosma/nib2objc · GitHub以下のように、パラメータにXIBファイルを指定すると、標準出力にコードが出力されます。 $ nib2objc WebView.xib > WebView.mこのようなビューから下記のコードが出力されます。 XIBファイルをソースコードに変換する場合…

NSDateFormatterはフォーマットする前にロケールを設定すべき?

日本語環境では、NSDateFormatterでフォーマットした日付がおかしい - 24/7 twenty-four seven前に日本語環境ではフォーマットした時刻の表記に「午前・午後」が含まれてしまって使いにくいと書いたのですが、コメントにて、フォーマットする前にロケール(NS…

マスクを使って画像を切り抜く

How to Mask an Image [iOS developer:tips]; 白黒の画像をマスクとして、画像を任意の形に切り抜くことが出来ます。 上記の例はとても単純ですが、マスク画像を工夫すれば、複雑な形の画像もプログラムから簡単に作成できます。 //元画像 UIImage *iconImag…

UIWebViewのタップ&ホールドで表示される「アクション」ポップアップを抑制する

LDR touchのエントリー画面のように、UIWebViewを、ブラウザとしてではなく、HTMLのビューアとして使ってるような場合は、このポップアップはあまり意味が無いので、出したくないときがあります。 これは以下のようなスタイルを指定すれば、抑制できます。 -…

UIApplicationを継承して、いろいろなイベントを受け取る

UIApplicationを継承すると、アプリケーションで発生するいろいろなイベントが受け取れます。継承した独自のUIApplicationクラスを使用するには、Other Sourcesにある、main.mを以下のように書き換えます。 int main(int argc, char *argv[]) { NSAutoreleas…

UITextFieldのテキストをインデントする

UITextFieldの文字の入力位置を調整する方法です。UITextFieldを継承したクラスを作り、次のメソッドをオーバーライドします。 - (CGRect)textRectForBounds:(CGRect)bounds; - (CGRect)editingRectForBounds:(CGRect)bounds; textRectForBounds:が返す値は…

UITabBarControllerを自動回転に対応させる

UIViewControllerと同じで、継承してshouldAutorotateToInterfaceOrientation:でYESを返します。 #import <UIKit/UIKit.h> @interface MyTabBarController : UITabBarController @end #import "MyTabBarController.h" @implementation MyTabBarController - (BOOL)shouldAut</uikit/uikit.h>…

iPhoneで1024ピクセル以上の巨大な画像を表示するビュー

http://kuon.goyman.com/2009/01/22/iphone-large-image-viewer/UIImageおよびUIImageViewは、1024x1024を超える大きさの画像を取り扱えません。このGYImageViewは、スクリーンに表示される部分だけ高解像度で表示するという方法で、巨大な画像でもメモリを…

UIWebViewのUser-Agentを変更する。

Yahoo! JAPANをはじめ、Safariで見るとiPhone用のページが表示されるのに、UIWebViewに表示する場合はPC用のページが表示されてしまうサイトがあります。 このようなサイトは、たいていブラウザのUser-Agentによって、表示するページを切り替えています。 UI…

NSAutoreleasePoolの動作について

3つめのコードがちょっと違います。 でもって本題ですが、Objective-CにはretainCountって物があって、それが0になると解放されるみたいです。(未だに良く理解してない) そしてretainCountはalloc, init, retainなどで増えて、releaseで減るみたいです。だ…

タイムゾーンを指定して、時間帯に応じた日時を取得する。

NSDateFormatterにタイムゾーンを指定して取り出します。 例えば以下のようにすると、どこの国で使用しても日本時間になります。 NSDate *now = [NSDate date]; NSDateFormatter *formatter = [[[NSDateFormatter alloc] init] autorelease]; [formatter set…