ラベル iPhoneDev の投稿を表示しています。 すべての投稿を表示
ラベル iPhoneDev の投稿を表示しています。 すべての投稿を表示

2015年12月6日日曜日

iOSでスキーマを使用してiTunesとApple Musicを起動する


iOSでiTunesのurlをスキーマ起動させた時に指定がないとApple Musicが起動されてしまいますが、iTunesを起動する方法を紹介します。
方法といってもとても簡単でurlパラメータをくっつけるだけです。

[iTunes]
app=itunes

[Apple Music]
app=music



このエントリーをはてなブックマークに追加

2015年4月26日日曜日

Xcode6.3+swiftでInstallation Failed Invalid argumentが出たときにやったこと



あ、どうも、swift環境に悪戦苦闘している管理人です。
Xcode6.3+swiftの環境でInstallation Failed Invalid argumentが出てシミュレーターにインストールができないという現象に悩まされたのですが、原因は

Resources

という名前のフォルダーをプロジェクトに追加しているからでした。グループ名にResourcesを使っている場合は問題ありません。メニューのAdd Files toからResourcesという名前のフォルダを選択して追加するとInstallation Failed Invalid argumentが発生しました。
フォルダー名前を変更してXcodeを再起動すれば解決しました。


このエントリーをはてなブックマークに追加

2014年8月23日土曜日

iPhoneアプリでジャンケンゲームを作ってみた

ゲームプログラミングの"いろは"および"設計パターン"を模索する為にジャンケンゲームを作ってみました。

bitbucketにsrcをアップしてあります。

https://bitbucket.org/yskmanabe/janken

参考にしたサイト


考察

たかがジャンケンゲームなのにかなり複雑になっしまいました(特にモデルの部分)。
原因としてはじゃんけんの手をプレイヤーが任意のタイミングで決定することができるという仕様が考えられます。
もし、ジャンケン開始時に手を決定するフェーズを設けた場合、モデルの機能は

  • 勝敗の判定
  • 勝負履歴の管理

のみとなりかなりシンプルになると思われます。
さらに、勝敗がジャンケン開始前に確定しているのでビューやコントローラーもかなり作り易くなると思われます。
[追記]
”あいこ"のことを全然考えていませんでした。”ジャンケン開始時に手を決定するフェーズを設ける"という設計は"あいこ"に対応出来ませんね。


また、プレイヤーが任意のタイミングで手を決定するというアクション性の高いゲーム性を実現する為の設計を模索する必要が有りそうです。


このエントリーをはてなブックマークに追加

2014年5月16日金曜日

AVCaptureDeviceのフレームレートを設定したのに反映されないキミへ

まずは次の確認をしてほしい。

  1. フレームレートを設定する前にAVCaptureSessionへAVCaptureDeviceInputが追加されているか
  2. AVCaptureDeviceのlockForConfigurationを呼び出してデバイスをロックした後にフレームレートを設定しているか

上記を考慮したサンプルソースがこれだ

検討を祈る

このエントリーをはてなブックマークに追加

2013年11月11日月曜日

iOS7からhidesBottomBarWhenPushedでタブバーが非表示にならない?

iOS7になって

self.hidesBottomBarWhenPushed = YES;

を記述してもなぜかタブバーが非表示になってくれないので
UITabBarControllerのviewDidLoadにて

self.tabBar.hidden = YES;

を記述してとりあえず対応しました。
画面単位の表示、非表示の切り換えとかどうしよう。。。

このエントリーをはてなブックマークに追加

2013年8月13日火曜日

[NSData dataWithContentsOfURL:]を使って簡単に非同期HTTP通信を実装する

iPhoneアプリでサーバーと非同期通信してデータを取得したいと思ったら
NSMutableURLRequest
NSURLConnection
NSOperationQueue
を使用して自前で実装したりフリーのライブラリを使用して受信データをNSDataに格納する人が多いと思いますが、実はNSDataには指定されたURLからデータを取得する
/*
 *指定されたurlからデータを取得する
 *@param url データを読み込むurl
 *@param readOptionsMask 読み込んだデータをキャッシュしない等のオプション指定
 *@param errorPtr エラーが発生した際のエラー格納先
 *@return 受信データ
 */
+ (id)dataWithContentsOfURL:(NSURL *)url options:(NSDataReadingOptions)readOptionsMask error:(NSError **)errorPtr;

というメソッドが用意されているんですね。
使い方はいたって簡単で


こんな感じでかなり簡単に実装できます。
が、このdataWithContentsOfURLには重大な欠点があります。
それは非同期では無いという事です。
つまりデータのダウンロードが完了するまでアプリがフリーズしてしまうんですね。

しかし、ご安心くださいGCD(Grand Central Dispatch)というObjective-Cの機能を使用すれば簡単に非同期にすることができるのです。
GCDの簡単な使い方は

dispatch_queue_t q_global = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_queue_t q_main   = dispatch_get_main_queue();
dispatch_async(q_global, ^{
// ここに非同期(バックグラウンド)で実行したい処理を記述
});

こんな感じです。
GCDを使って先ほどのdataWithContentsOfURLを非同期化すると

こうなります。
ベーシック認証なんかもdataWithContentsOfURLを使用すれば簡単に実装できます。


このエントリーをはてなブックマークに追加

2013年5月3日金曜日

ARCを使わないObjective-Cのメモリ管理はこうすればリークも不正落ちも怖くない

Objective-Cはガベージコレクションを搭載していないので、メモリ管理が結構たいへんですがルールを決めてしまえばそんなに大変ではなくなるので楽してメモリ管理する方法をまとめてみました。

[前提条件]

  1. xcode4.5以上を使用する。

[ポイント概要]

  1. プロパティ記述時の属性(retain assign copy)を使い分ける
  2. alloc時にはautoreleaseを記述する
  3. 自クラス内のインスタンス変数へアクセスする時はプロパティを使用する
  4. retain、copy属性のプロパティはdealloc内でnilを代入する

[ポイント詳細]


ポイント1:プロパティの記述時の属性(retain assign copy)を使い分ける

ヘッダーファイルのクラス宣言内に記述するプロパティの属性を正しく使い分けます。

  1. object型はretainを指定する
  2. NSString型はcopyを指定する
  3. プリミティブ型はassignを指定する
  4. delegateはassignを指定する

※Objective-Cで使用できる主なプリミティブ型
short (signed short)
unsigned short
int (signed int)
unsigned int
float
double
char
BOOL

ポイント2:alloc時にはautoreleaseを記述する

オブジェクトをallocしたら必ずautoreleaseを記述します。


ポイント3:自クラス内のインスタンス変数へアクセスする時はプロパティを使用する

プロパティを使用しない場合、メモリリークや解放済みのオブジェクトへのアクセスが発生する可能性が高くなります。


ポイント4:retain、copy属性のプロパティはdeallocないでnilを代入する

retain、copy属性が指定されたプロパティはdeallocでnilを代入しないとメモリリークが発生してしまいます。


◎autoreleaseを記述しない方がいい場合

例外としてループ(for、while)内でオブジェクトを生成する場合はメモリ節約の観点からautoreleaseを使用しない方が良いでしょう。

このエントリーをはてなブックマークに追加

2013年1月30日水曜日

UIWebViewおよびUIImageでDocuments配下の画像を読み込む

UIWebViewやUIImageViewでDocumentsフォルダ配下の画像ファイルを指定するには
次のように実装します。

ちなみに

NSString *directory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
では取得出来ませんでした。


このエントリーをはてなブックマークに追加

2013年1月25日金曜日

xcodeのストーリーボード(storyboard)で初期値設定を独自に追加する

ストーリーボードのattributes inspectorに表示されないプロパティやUIViewを継承して追加した独自のプロパティ等をストーリーボードから初期値設定したい場合は
identity inspectorUser Defined Runtime Attributes
に追加することで設定出来ます。
例)UIViewのexclusiveTouchを初期値YESに設定する


このエントリーをはてなブックマークに追加

2012年12月21日金曜日

Could not launch No such file or directory

xcodeで
「Could not launch No such file or directory 。。。」
ってエラーが出てアプリが起動しなくなってしまった時に行ったこと。

  1. xcodeの再起動
  2. アプリ削除
  3. クリーンビルド


このエントリーをはてなブックマークに追加

2012年11月12日月曜日

unable to dequeue a cell with identifier Cell - must register a nib or a class for the identifier or connect a prototype cell in a storyboard

xcode4.5以降でUITableViewのdelegateメソッドが自動生成されると、このエラーが出る場合があります。
原因は

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{]
内に自動生成されたコードに
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

が記述されているからです。
このメソッドはiOS6.0以降でないと使用できません。
なのでiOS6.0未満も対応しているアプリではエラーとなってしまいます。

◎解決方法
従来の
- (id)dequeueReusableCellWithIdentifier:(NSString *)identifier; 
を使用するだけで解決します。

このエントリーをはてなブックマークに追加

2012年11月8日木曜日

xcodeプロジェクトをgitで管理する際に無視させるディレクトリとファイル


.DS_Store
*.xcodeproj/*.mode1v3
*.xcodeproj/*.pbxuser
*.xcodeproj/*.xcworkspace
*.xcodeproj/xcuserdata/
*.xcworkspace/xcuserdata/
build/
.svn/
*.swp
*.nib
Thumbs.db
*.[oa]
*~
*.bak





◎無視させるようにする手順

  1. ターミナルを起動する
  2. $git config --global core.excludesfile $HOME/.gitexclude
  3. .gitexcludeファイルに無視するディレクトリやファイルを記述する

※上記の方法で無視させた場合、環境依存になってしまう(MAC毎に設定が変わってしまう)為、プロジェクト毎に.gitignoreを配置するのが良いでしょう

このエントリーをはてなブックマークに追加

2012年11月2日金曜日

iphoneシミュレーターで現在位置を変更したい

iphoneシミュレーターの現在位置は初期設定だとアメリカになっています。
現在位置はiphoneシミュレーターのメニューから変更することが可能です。
iphoneシミュレーターの現在位置を変更するスクリーンショット
このエントリーをはてなブックマークに追加

2012年10月22日月曜日

iphoneシミュレーターのホームボタンがなくなっている。

iphone5シミュレーターにはホームボタンがないのですが、メニューからホーム画面に遷移させることができます。
iphone5シュミレーターのホームボタンを表示するメニューのスクリーンショット
このエントリーをはてなブックマークに追加

2012年10月5日金曜日

sqlite3でテーブルが存在していた場合だけdropしたい

そんなときは

このエントリーをはてなブックマークに追加

2012年10月1日月曜日

'hoge.js' of type sourcecode.javascript for architecture i386ってwarnigを消したい

xcodeではAdd filesで.jsファイルを追加した場合にCompile Sourcesに追加されてしまい、「jsファイルのコンパイル方法がわかりません」と表題のワーニングが出てしまいます。
このワーニングを消す手順を紹介します。

  1. Compile Sourcesから.jsファイルを削除する
  2. Copy Bundle Resourcsに.jsファイルを追加する。
1.Compile Sourcesから.jsファイルを削除する



2.Copy Bundle Resourcsに.jsファイルを追加する。

このエントリーをはてなブックマークに追加

2012年9月5日水曜日

Objective-Cでクラスメソッドの有無を判定する

そのクラスに指定したクラスメソッド(セレクター)が存在するのか判定する為には
- (BOOL)respondsToSelector:(SEL)aSelector; 
を利用します。 このメソッドはインスタンスメソッドなんですけど、なぜかクラスに対して呼び出すことができます。コンパイルも通るし実行時に落ちたりもしません。(小一時間調べたけど分からずじまい)
このエントリーをはてなブックマークに追加

2012年8月24日金曜日

「Declaration of 'struct sockaddr_in' will not be visible outside of this function」って警告がでちゃったYO

「Declaration of 'struct sockaddr_in' will not be visible outside of this function」の解決方法は

  1. netinet/in.hをインポートする

このエントリーをはてなブックマークに追加

2012年7月6日金曜日

ゲームのデータを考える時のヒント

ゲームのデータを考えるのってすーーっごく大変なんだと最近分かりました。
ただ闇雲に考えてもなかなか思い浮かばないのでヒントをまとめてみました。

◎モンスター編

  1. 新しい生息地を与える(ツンドラ・ウルフ)
  2. 新しい色を与える(ブラック・ドラゴン)
  3. 新しい見た目を与える(クリスタル・タートル)
  4. 新しい属性を与える(ヴェノム・スパイダー)
  5. 新しい能力を与える(フライング・ソード)
  6. 合成する(ドラゴン・アント)
  7. 他の物に例える(スパイク:とげが生えた芋虫、シー・デビル:タコみたいの)
  8. 表現を変える(ファイア、フレイム、ブレイズ、バーン、アグニート)
  9. ドロップ・アイテムを参考にする(血の結晶:ブラッド・スライム)
  10. 巨大化させる(ジャイアント・ワーム)
  11. 強さのランク付けをする(ウォーリアー、ナイト、マスター、ロード)
  12. 乗りものに乗せる(ドラゴン・ライダー)
  13. レア度を考える(common、uncommon、rare、boss、s-boss)

◎アイテム編

  1. アイテムの用途を考える(回復、攻撃、治療、素材)
  2. モンスターや特定種族が生成するアイテムを考える(オーク・メタル)
  3. モンスターの体から採取することを考える(ねずみのしっぽ)
  4. 素材に分割する(布・蜘蛛の糸・鉄)
  5. 強弱、大小、等ランクをつける(レッサー、ノーマル、グレーター)

◎装備編

  1. 属性や魔力を与える(フレイム・アーマー、ホーリー・クロス)
  2. 材料から考える(アイアン・ヘルム)
  3. 特定のモンスターや種族の名前を与える(イフリート・ロッド、エルヴン・ブーツ)
  4. シリーズ化する(レザー・ヘルム、レザー・アーマー、レザー・ブーツ)
  5. 特化能力から考える(スピード・ブーツ、デーモン・キラー)
  6. 職業から考える(盗賊の指輪
  7. 表現をかえる(クロス、ローブ、アーマー、シャツ、メイル)
このエントリーをはてなブックマークに追加

2012年6月13日水曜日

cocos2dで開発環境をretina専用(低解像度非対応)にする

最近はcocos2dを触っているのですがデバイス3GS以下が比対応の場合に画像を低解像度、retina、二つ用意するのは面倒なのでretina用の画像だけでcocos2d開発する方法を調べました。

  1. retina用の画像だけを用意する。例)hoge.png
  2. CCDirectorをretinaに対応させる
  3. retina用のファイル名サフィックスを設定する
です。簡単ですね。2、3のソースコードはこちら


サフィックスを空文字にするだけでした、ちゃんちゃん。
このエントリーをはてなブックマークに追加