2012年3月3日土曜日

無料iPhoneアプリ「なむぞう」リリースしました!

どうも、俺@スノボから帰ってきました。
今回はちょっと技術ネタから外れますが。。。

さてさて、やっとiPhoneアプリ「なむぞう」をリリースすることができました^^

http://itunes.apple.com/jp/app/namuzou/id499190444?mt=8







デザインも自分で担当したため、オシャレなUIとまではなりませんでしたが
配色サンプルを色々試して何回も試行錯誤しながらUI全体の色イメージをつくっていきました。

あと、どうでも良いですが
アイコン画像にいるイモムシのようなやつが「なむぞう」というキャラクターという設定です。


リリース直後にGameCenterにつながらない不具合が見つかったり、その他色々。。。。
初めてのアプリ開発で色々戸惑いも多かったですが、もう大丈夫です!!


紹介動画です^^
http://www.youtube.com/watch?v=yxUu9crJtas
動画編集ソフトやYoutubeの機能を駆使してつくりました!


Objective-Cについて、色々とスキルを身につけられましたが
それと同様にドローソフトや動画編集ソフトの使い方に詳しくなれました。



以上でぇぇぇぇす。

2012年2月9日木曜日

NSLocalizedStringとstringWIthFormatを使ってiPhoneアプリの多言語化

どうも、俺@仕事中です。
今日はiPhoneアプリをNSLocalizedString()とNSString stringWithFormatを使って多言語対応する方法のめもめもです。

日本語環境のみに作ったアプリを
NSString *str = @"にほんご";
英語圏で使うようにするには

NSString *str = NSLocalizedString(@"key", @"comment");
としておき、ターミナルから

genstrings -a $(find ./ -name "*.m");
とすればLocalizable.stringsファイルができるので、Xcode内にドラッグ&ドロップ(Xcode4では「Supporting Files」が適当かな)します。
Localizable.stringsはUtilitiesのFile Inspectorから作成する言語とText−Encoding(UTF-16)を設定します。
Localizable.strings内では
・Localizable.strings(English)
"key" = "Japanese;"

・Localizable.strings(Japanese)
"key" = "にほんご"
としておけば、"key"と記述した部分をそれぞれの言語に変更してくれます。
※ここでは"Japanese"と"にほんご"に置換してくれる。

これら詳しい説明は
NSLocalizedStringでiphoneアプリ多言語対応 Xcode4 - はるかなる熊がとても参考になりました。


ところで、英語と日本語では文法的に単語の出てくる順番が異なるときが出てくる。
例えば
私は「テトリス」で「100」pt取った。
という日本語を英語にすると
I took 「100」pt in 「Tetris」.
となる。「」で囲まれた単語が異なる場合がある。
こういう場合、まずobjective-cのソースコードでは英語に合わせて作ったほうが分かりやすい。

NSString *str = [NSString stringWithFormat: NSLocalizedString(@"long sentence", @"some comment"), @"100", @"Tetris"]
こうしておいた上で、それぞれのLocalizable.stringsでは
・Localizable.strings(English)
"long sentence" = "I took %d pt in %@.";

・Localizable.strings(Japanese)
"long sentence" = "わたしは%$2@で%1$d取った。";
とする。
stringWithFormat の%$n@でフォーマットに入れる変数の順番を変更できるのです。(nは整数)


以上でぇぇぇぇぇぇす。

2012年1月31日火曜日

Xcode 実機で動作しなくなる('NSInternalInconsistencyException', reason: ' Could not load NIB in bundle...)

どうも、俺@絶賛objective-c中です。

Xcode ver.4.2で開発してて、iPhoneシュミレーターでは動作確認できるのですが急に実機で動作しなくなった!という場合の対処法めもです。
場合によっては原因が異なると思うので、これが解決法の全てではないかもしれませんが。。

iPhone実機(5.0.1)に繋いでXcodeからビルド&実行すると以下のようなエラーが出てしまい、ビルドはできるのですが実行できません。

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Could not load NIB in bundle: 'NSBundle (loaded)' with name 'ViewController'
つい5分前までは動いてたのに!
原因はよく分かりませんでしたが、以下をやることで実機でも動作するようになりました。

エラーログにある「ViewController.xib」を開き、右側の「Utilities」>「File Inspector」内にある「Localization」の部分を見ます。
僕の場合は
English
の1つのみが書かれていたので、「Japanese」を追加します。

するとViewController.xibが
ViewController.xib(English)
ViewController.xib(Japanese)
の2つになります。
この状態で実機転送すると動作します。

このあと、なぜか先ほどのLocalizationにある
Japanese
は削除しても実機で動作しちゃいます。

理由はよくわかりませんが、もしトラブった人は試してみて下さい。


以上でぇぇぇぇぇぇす。

UIViewアニメーションで一時停止

どうも、俺@コーディング中です。
今日はObjective-Cでアプリ開発をしてて、UIViewのアニメーションを使うことはよくあるのですが、今日はそのアニメーションを一時停止させる方法をめもめもします。
// hogeLabelの座標は(0, 0)
hogeLabel.frame = CGRectMake(0, 0, 100, 100);

// アニメーション開始
[UIView beginAnimations:nil context:nil];

// アニメーション時間
[UIView setAnimationDuration:1.0f];
[UIView setAnimationCurve:UIViewAnimationCurveEaseIn];

// hogeLabelを(200, 200)の位置へ動かす
hogeLabel.frame = CGRectMake(200, 200, 100, 100);

[UIView setAnimationDelegate:self];
[UIView setAnimationDidStopSelector:@selector(hogeLabelStopped:finished:context:)];
[UIView commitAnimations];
とりあえずこれでhogeLabelは座標(0, 0)から(200, 200)へ1秒かけて動くアニメーションができました。
このあとセレクターメソッド(hogeLabelStopped)内で、一旦停止させるには

- (void)hogeLabelStopped:(NSString *)animation finished:(BOOL)finished context:(void *)context
{
  // 一時停止(0.5秒)
  [NSThread sleepForTimeInterval:0.5];

  // その他の動作はこれ移行に記述
}
こんな感じです。[NSThread sleepForTimeInterval:(double) interval]はスレッドをsleepさせる静的なメソッドです。

以上どっぇぇぇぇぇえっぇぇす。

2012年1月20日金曜日

UIViewのアニメーションで画面遷移

どうも、俺@仕事中です。久々のObjective-Cです。
アプリでUINavigationControllerを使わずに画面をアニメーションさせて遷移させる方法を調べたのでメモメモ。

右から左へスライドインする処理
■元画面(FirstView: UIVIewControllerを継承)
// 遷移先UIViewを画面外に生成(SecondView: UIVIewを継承)
secondView = [[SecondView alloc]initWithFrame:CGRectMake(self.view.frame.size.width + 1, 0, self.view.frame.size.width, self.view.frame.size.height)];

// アニメーション開始
[UIView beginAnimations:nil context:nil]:
[UIView setAnimationDuration:0.5]; // 0.5秒かけて
[UIView setAnimationCure:UIViewAnimationCurveLinear]; // 一定速度で
[self.view addSubview:secondView]; // addSubviewする

secondView.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height); // 画面内へ動かす
[UIView commitAnimations]; // アニメーションコミット
これで右から画面内へスライドインする遷移ができます。

今度は戻るボタンなどで元画面へ戻る処理です。
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.5];
[UIView setAnimationCurve:UIViewAnimationCurveLInear];
[UIView setAnimationDelegate:self]; // デリゲートをselfで指定
[UIView setAnimationDidStopSelector:@selector(animationStopped:finished:context:)]; // アニメーションが完了した時の処理

secondView.frame = CGRectMake(self.view.frame.size.width + 1, 0, self.view.frame.size.width, self.view.frame.size.height); // 画面外へ
[UIView commitAnimations];
/**
 * アニメーション停止後の処理
 */
- (void)animationStopped:(NSString *)animation finished:(BOOL)finished context:(void *)context
{
  [secondView removeFromSuperview]; // secondViewをremoveFromSuperviewする
}
こうなります。
secondViewをremoveFromSuperviewする場合は、UIViewのsetAnimationDidStopSelectorを使ってアニメーション停止後の処理をセレクターを使って処理させて下さい。そうしないとアニメーションが動きません。
またその場合はUIViewのsetAnimationDelegateメソッドを呼んでおく必要があります。
以上でぇぇぇぇぇぇす。