Home > iPhone SDK / Cocoa / Objective-C

iPhone SDK / Cocoa / Objective-C Archive

ホームスクリーンに表示されるアプリ名をローカライズするには

InfoPlist.stringsという名前の、ローカライズされたファイルを作成し、その中に

CFBundleDisplayName = “(アプリ名)”;

と書いておけばOKです。

関連する投稿

UIViewのスクリーンショットの画質を良くしたい

UIViewの中身を画像ファイルとして写真アルバムに保存するには下記のような感じでいけるのですが、これだとどうも画質がいまいちです。

UIViewスクリーンショットをライブラリに保存する方法 - まひるのiPhoneラボ - iPhoneアプリ開発グループ

Jpegの圧縮率は UIImageWriteToSavedPhotosAlbum が勝手に決めてしまっていて、自分で指定することはできません。それならばと自力で処理する方法を探してはみたのですが、写真アルバムにファイルを保存することができません。これは、セキュリティへの配慮により、アプリケーションが読み書きできるのは Application Home 以下のファイルに限られているためです。UIImageWriteToSavedPhotosAlbum はあくまでも例外ということですね。

Application Home 以下でよければ、下記のような感じで最高画質で保存できるのですが……。

NSData *imageData = UIImageJPEGRepresentation(UIGraphicsGetImageFromCurrentImageContext(), 1.0);
 
NSString *filePath = [NSString stringWithFormat:@"%@%@" ,NSHomeDirectory() , @"/Documents/hoge.jpg"];
[imageData writeToFile:filePath atomically:YES];

(追記)NSHomeDirectory()には直接ファイルを書き込めないので、Documentsディレクトリに保存するようサンプルコードを修正しました。それと、ファイルパスの文字列を作るには stringByAppendingPathComponent: などという便利なメソッドがあるのでこちらを使った方が良いようです。

関連する投稿

CGValueはないけれどNSValueが使えます

CGRectやCGPointといったCoreGraphicsで定義された構造体をNSArrayなどに入れる場合、直感的にはCGValueというラッパが有りそうな気がします。しかし、実際にはCGValueというクラスは存在しません。

調べてみるとAppleのDeveloperForums(英語)でズバリWrapper for CGRect?というトピックを発見しました。
このトピックでのやり取りを要約すると、CGRectやCGPointでもNSValueが使えるということでした。どうやら回答者もこの質問を受けて初めて存在に気がついたようです。

このことを調べていて知ったのですが、CocoaにはCGRectやCGPointと同等のNSRectやNSPointといったクラスが有るそうです。ただし、これはMac OS X(App Kit)のお話でiPhoneアプリには関係ないみたいです。逆に言うとApp Kitでの開発になれた人はCoreGraphicsで定義されているこれらを使うことになれる必要が有るでしょう。

関連する投稿

syntax error at ‘OTHER’ token

タイトルのエラーが発生しました。どうやら、(Webからコピペしてきたので)コード中に全角スペースが含まれていたことが原因だったようです。

こういうことはわりとありがちなので、ソースコードを書くエディタでは全角スペースを可視状態にする主義なのですが、Xcodeにはその設定がないようです。国産ツールではないので仕方ないですかね(それでもタブくらいは可視化設定できてもよい気がしますが)。

関連する投稿

アプリ起動時にスプラッシュムービーを表示するには

アプリ起動時にロゴアニメーション等のスプラッシュムービーを再生する場合には、applicationDidFinishLaunchingの中でムービーの再生を開始し、再生終了時のNotificationによって初期画面を表示するのがよいようです。

- (void)splashMoviePlayBackDidFinish:(NSNotification *)notification
{
  // スプラッシュムービーの再生が終わったら初期画面を表示
  [[NSNotificationCenter defaultCenter] removeObserver:self];
  [window addSubview:[navigationController view]];
}
 
- (void)applicationDidFinishLaunching:(UIApplication *)application
{
  // 省略
 
  [[NSNotificationCenter defaultCenter] addObserver:self
                                           selector:@selector(splashMoviePlayBackDidFinish:)
                                               name:MPMoviePlayerPlaybackDidFinishNotification
                                             object:(MPMoviePlayerControllerインスタンス、またはnil)];
 
  // ここで動画を再生                                                                                                
}

ちなみに、Default.pngの代わりに動画またはアニメーションGIFを表示することは不可能なようです。

関連する投稿

.wavファイルをまとめてIMA4圧縮の.cafファイルに変換

> find . -name '*.wav' -exec /usr/bin/afconvert -f caff -d ima4 {} \;
危なく無駄にQuickTime proを買ってしまうところでした。

ついでに、サンプルコードのoalTouchに入っている音声ファイルは16bit・整数・リトルエンディアン/モノラル/22.05kHzとなっていますが、これと同じ形式のファイルを作るには、

> /usr/bin/afconvert -f wav -d LEI16@22050 -c 1 [input_file]
こんな感じですね。これが効果音として最適な形式なのかどうかはわかりませんが、少なくとも、複数の音声を同時に再生するときにはサンプリングレートを44.1kHzではなく22.05kHzにした方がよいとドキュメントにはあります。

iPhoneアプリを作っている人はUnixに慣れた人ばかりではないでしょうから、afconvertコマンドのGUIフロントエンドを作れば少なからず需要がありそうです。

関連する投稿

Javascript+HTMLで(AppStoreで売れる)iPhoneアプリを作る

App Store登録もOK! JavaScriptで作るiPhoneアプリ(1/4)- @IT

ごくカンタンに要約すると、

  • アプリケーションのコア部分はHTML+Javascriptで作って、それをUIWebViewで表示する
  • ローカルストレージへのデータ書き込み・読み出しはiPhoneのSafariが元々対応している、HTML5の「Client-side Storage」を使って可能
  • デバイス周りのAPI(加速度センサとかカメラとか)も、サードパーティ製のフレームワークを導入することによりJavascriptから呼び出せるようになる
  • 外観をネイティブアプリっぽくするのもわりとカンタン(SDK同梱のDashcodeを使う)

ということのようです。

「海外の開発者たちが注目している」と書いてはあるもののホントかな?と思っていたのですが、「サードパーティ製のフレームワーク」がすでにいくつもあるところを見ると、本当にそうなのかもしれません。

個人的にはあまり興味は沸きませんが、既存のWebアプリをiPhoneアプリに移植する場合などには検討に値する選択肢になりそうです。

関連する投稿

NSUserDefaultsで保存したプロパティの在処

シミュレーター

~/Library/Application Support/iPhone Simulator/User/Applications/(インストールする度に変わる文字列)/Library/Preferences/(Bundle Identifier).plist

実機

/var/mobile/Applications/(インストールする度に変わる文字列)/Library/Preferences/(Bundle Identifier).plist

関連する投稿

数値などをNSArrayやNSSet,NSDictionaryなどに格納する方法

intやdoubleなどの数値をコレクションクラスであるNSArrayなどに直接格納しようとしてみます

NSMutableArray* anArray = [NSMutableArray array];
NSInteger i = 0;
[anArray addObject: i];

すると「warning: passing argument 1 of ‘addObject’ makes pointer from integer without a cas」などとXcode上に警告が表示されてしまいます。
どうやら、コレクションクラスには数値などを直接格納することができないようです。

正しく格納するにはNSNumberクラスでラップしてやる必要があるようです。

NSMutableArray* anArray = [NSMutableArray array];
NSInteger i = 0;
[anArray addObject: [NSNumber numberWithInteger:i]];

関連する投稿

Viewをクロスフェードで切り替えるには

サンプルコード「ViewTransition」にあるようにCATransitionを使う方法でももちろんよいのですが、UIViewクラスのクラスメソッドを使う方が、登場するクラスが少ないという意味ではよりシンプルです。

ぱっと見ではsetAnimationTransition:forView:cache:メソッドが使えそうですが、1つ目の引数として与えるトランジションのタイプの選択肢にクロスフェードがありません。そこで、あらかじめ切り替え後のビューをalpha=0.0の状態でaddSubview:しておいた上で、以下のようにします。

[UIView beginAnimations:nil context:NULL];
currentView.alpha = 0.0;
nextView.alpha = 1.0;
[UIView commitAnimations];

複雑なアニメーションを作成するにはどうしてもCAAnimationクラスが必要になることもありますが、UIViewのアニメーション関連メソッドを活用することで同様の効果を少しだけ楽に実装することができます。

もっとも、上記の例では切り替え前のビューのインスタンスが残ったままになるため、不要であればsetAnimationDidStopSelector:を使ってアニメーション終了後にremoveFromSuperView:しなければならない、といったように、逆に手間がかかる場合もありますが。

ちなみに、setAnimationDuration:とsetAnimationDelay:を使えば、簡単なキーフレームアニメーションっぽいものも実装できますね。

例)Viewをクロスフェードで切り替えて、すぐにクロスフェードで元に戻す

[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:1.0];
currentView.alpha = 0.0;
nextView.alpha = 1.0;
[UIView commitAnimations];
 
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDelay:1.0];
currentView.alpha = 1.0;
nextView.alpha = 0.0;
[UIView commitAnimations];

関連する投稿

ホーム > iPhone SDK / Cocoa / Objective-C

Search
Feeds
Meta

Return to page top