MKMapViewのzoomの挙動


Cocoaの日々: CoreLocation – [3] MKMapView の初期表示設定
MKMapViewのzoomについてこちらを参考にさせて頂いている中で、下の投稿を知ったのでメモのつもりで日本語訳しました。
(なんか英語が分からないところがあって訳がハチャメチャなので原文を読んだ方がマシかもしれませんが。。。)

iphone – MKMapView Zoom and Region – Stack Overflow
続きを読む

google mapをiPhoneアプリで使う


Google Maps SDK for iOSを使えるようにするまでの記録。

Maps SDK for iOSに使用制限はあるのか

まずgoogle mapは自由に使っていいのかライセンス的にはどうなっているのかが気になったので調べてみた。
気になったところだけピックアップする。
(間違っているかもしれないので、利用するときには必ず公式のドキュメントで確認してください)
続きを読む

cocos2d ローカル変数のアンダースコアの位置


cocos2d-xを使ってゲームのアプリを作ろうとしていたのですが、ネットで検索した情報やサンプルコードがcocos2d-iPhoneのものばかりで心が折れてしまい、cocos2d-iPhoneに乗り換えてしまいました。

さて、cocos2dのサンプルコードをそのままコンパイルすると大量のエラーが出ました。
調べてみると cocos2d V2.1からローカル変数の アンダースコア’_’の位置が前に変更になっているのですね。

Objects uses the ‘_’ prefix for ivars. It is no longer used as a suffix.

cocos2d v2.1 release notes · cocos2d/cocos2d-iphone Wiki · GitHub

手作業で全て変更すると無事コンパイル成功。

renaming ivars_ to _ivars | cocos2d for iPhone
この辺を読むと、「Appleが ‘_’prefixを許可しただけでなく推奨しているから、sufixからprefixに変更しよう」みたいな話し合いがされたのかな。
英語が理解できなくてどういう方向に話が進んだのかイマイチ分からないのですが、変更するという結論になったということか。

iphone 5.1 SimulatorのUIImagePickerControllerでエラー


iPhone 5.1 Simulator(not retina)でテストしていたアプリがiPhone 5.1 Simulator(retina 3.5 inch)ではエラーが出て止まってしまいました。

UIImagePickerControllerを呼び出す辺りで止まっていて、出たエラーはこのようなもの。

Named service 'com.apple.PersistentURLTranslator.Gatekeeper' not found. assetsd is down or misconfigured. Things will not work the way you expect them to

グーグルで調べたりしていたのですが、これって昔も遭遇したことがあるような。。。
iPad 5.1 simulator で UIImagePickerController が正常に動かない
これと同じ現象でした。

今回は、シミュレータを再起動してもダメで、一旦 iPhone 6.0 Simulatorを動かしてから、再び iPhone 5.1 Simulatorを動かすとエラーも出ず動いてくれました。

cocos2d-x勉強中


息子からもっと面白いゲームを作ってくれと言われ cocos2d を勉強中。
cocos2d for iPhoneをダウンロードしてきてサンプルプログラムを眺めたりウェブから情報を集めたりしていたんだけど、イマイチ効率が上がらない。
phpなんかはウェブの初心者講座的なページを見ながら勉強したんだけど、これだと基本的な事柄が理解できていないことに後から気付いたりすることがある。
どうやらウェブで新しいプログラミング言語を習得するというのは私には向いていないようだ。

そこでAmazonで探して買ったのがこちらの本。
cocos2dはどんどん開発が進んでいるようで、少し古い本だと既に情報が古くなってしまっている可能性があるので、なるべく新しい本を選んだ。
この本は2013年6月に出版されたもの。

本をパラパラめくって最初に思ったのは「作者は猫好き」。
一応一通り読み終えたんだけど説明にカラー画像が多く使われていて、説明も丁寧で分かり易い反面、全体のボリュームは少な目な印象。
初心者向けにcocos2dと一緒に使用すると便利なソフトがいくつも紹介されてて(ほぼ有料ソフトなんだけど)、そこら辺の知識もなかったので助かった。
そして cocos2d for iPhone を習得するつもりだったのだが、この本はcocos2d-xについて書かれた本だった。cocos2d for iphoneとcocos2d-xが違うものだったなんて、この本が届くまで考えもしなかった。cocos2d-xはマルチプラットフォーム向けに開発している人向けでC++なのね。
でもまぁしばらくは cocos2d-x を学んでいこうと思う。
cocos2d-xでiPhoneアプリを作るものそれほど不便でもなさそうだし、いつかandroid版のゲームを作る可能性もあるかもしれないからね。

本に最初に載っているサンプルプログラムは「さめがめ」。
名前だけは聞いたことがあったけど、こんなゲームなのかぁ。
一度に多くのコマを消すと高得点。いかにコマをまとめて消すかを考えるゲームなのね。

サポートサイトに置いてあるサンプルプログラムをそのまま動かしていても、理解したつもりになっていたがまったく身に付いていないなんてことになりそうなので、今回は本を傍らに実際に手を動かして作ってみた。

そして、、、もっとつまずくかと思ったけど、本にはコードを省略せず一から十まで細かく丁寧に説明してあるのであっさり動いた。
ただこれだけだと面白くないので、少しでも息子に遊んでもらおうと、息子が大好きなマインクラフトのキャラクターを組み込んでみた。

効果音もマインクラフトから持ってきた。
羊とスケルトンが白っぽくて見辛い。
スティーブの声は昔のバージョンの「うおっ」ってやつを採用。

息子が喜んだら背景画像とか、メニューボタンとかもminecraft風にしようかと思ってたけど、あんまり食いつかないので改造はこの辺で終了。
さぁ次のサンプルアプリにとりかかるか。

日本語訳 iOS7 beta for Developers


iOS7 beta for Developersに書かれているiOS7での開発者向けの変更点、新機能の概要ページを日本語訳してみました。
とは言っても英語力不足と最後の方は気力も不足しており、かなりかなーり怪しい訳になっています。
間違い等コメントでご指摘いただけると助かります。
続きを読む

XIBファイルでUIViewController の見た目を作る


UIViewControllerを使いたかったのだが、載せる部品が多くなりそうだったのでコードで書くのではなくxibファイルで見た目を作成することにした。
問題はXIBを使うのが初めてで、まったくやり方が分からないこと。
よく分からないので、まずXIBファイルを作成してから.m .hファイルを作成するという手順でやっていたのだが、かなりハマって遠回りしてしまった。

今のところ分かったことをメモ。

まずは簡単に動いた方法から。
続きを読む

NSMutableArrayでつまずいた2つのこと


昨日NSMutableArrayを使っていて2カ所でつまずいたのでメモ。

高速列挙子でアクセス中の配列の要素を追加、削除しないこと!


for(NSString * str in ary){
	if([str isEqualToString:targetStr]){
		[ary removeObject:str];
	}
}

このようにFast Enumerationを使ってアクセスしているときに配列の要素を追加、削除すると

Collection was mutated while being enumerated

のエラーになる。


for(NSString * str in [ary reverseObjectEnumerator]){
	if([str isEqualToString:targetStr]){
		[ary removeObject:str];
	}
}

のようにして配列の最後から最初に向かって読み込むようにすると問題は解決する。
何番目の要素を操作するかを記録しておいて、forループの外で操作するようにしたりしてもいいかも。

参考
【コラム】ダイナミックObjective-C (105) Fast Enumeration(1) – 速い列挙子 | 開発・SE | マイナビニュース
Objective-Cと戦うブログ: 高速列挙でエラー「Collection was mutated while being enumerated.」が出た

NSUserDefaultsからmutableArrayを読み込むときはmutableCopyすること


NSMutableArray * ary = [[NSUserDefaults standardUserDefaults] objectForKey:aryKey];
[ary addObject:@"d"];

このようにすると以下のエラーになる。

'NSInternalInconsistencyException', reason: '-[__NSCFArray insertObject:atIndex:]: mutating method sent to immutable object'

「変更できないオブジェクトに、変更しようとするメソッドが送られたよ」と。
userdefaultsからNSMutableArrayを読み込むときは、immutableな配列が返ってくるので以下のようにmutableCopyしてやる必要があるらしい。


NSMutableArray * ary = [[[NSUserDefaults standardUserDefaults] objectForKey:aryKey] mutableCopy];
[ary addObject:@"d"];

マニュアルのobjectForKey:の項目を読むと、確かにimmutableになると書いてある。

Special Considerations
The returned object is immutable, even if the value you originally set was mutable.

が、参考になる記事が見つからなかったら結構悩んだに違いない。
先人に感謝。

参考
きみが思い出になる前に - NSUserDefaultsに保存したmutableなオブジェクトはmutableCopyを使って作り直す

Xcodeでカーソルのあるブロックをハイライト表示


こんな記事を見つけました。

Xcode4: 隠し機能?自分のいる場所をハイライトさせる | st.Prestage

こんな感じでカーソルがあるブロックをハイライト表示してくれるというもの。

続きを読む

UIViewController + UITableView


■UITableViewControllerからUIViewController+UITableViewへ

今作っているアプリ。
当初UITableViewControllerを使って実装していたのだが、ナビゲーションバーとテーブルの間に広告を表示させるようにしたかった。
方法を模索するもどうやらUITableViewControllerで作ったUITableViewのframeは自由に変更できないような感じ。
そこで仕方なくUITableViewControllerを使わないようにして、UIViewControllerの派生クラスにUITableViewのインスタンスを持たせるように変更した。

こちらのサイトを参考にさせて頂いた。

UIViewControllerをつかって、UITableViewControllerを実装する

■変更時につまづいた箇所

基本的には上記のサイトのように実装を変更した。
が、UITableViewを使うのが初めてでまったく理解できていないのでかなり苦戦。
ベースの知識が違い過ぎるんだよなぁ。

・インターフェイス部にUITableViewDataSource,UITableViewDelegateの二つのプロトコルを採用していることを宣言する必要がある

<UITableViewDataSource,UITableViewDelegate>

・delegateとdatasourceの設定が必要

self.tableView.delegate = self;
self.tableView.dataSource = self;

・storyboard上のUITableViewを削除
これだけやってなんとなく動いていると勘違いしてしまったが、シミュレータ上ではstoryboardの中で設置していたUITableViewが見えていてコードで追加した方のUITableViewが使われていなかったので、storyboardの方のUITableViewを削除。
そういえばコードで追加した方のUITableViewはframeも設定していなければaddSubviewもしていなかったのだった・・・(情けない><)
コードで書くのならこれもやんなきゃね。

・dequeueReusableCellWithIdentifier:を使うように変更
storyboardの方のUITableViewを削除した関係で、cellForRowAtIndexPathの中でdequeueReusableCellWithIdentifier:forIndexPath:を使っていた箇所をdequeueReusableCellWithIdentifier:を使うように変更。
dequeueReusableCellWithIdentifier:forIndexPath:の方は、実行前にUITableViewCellを作成しておく必要があったのね。

Important: You must register a class or nib file using the registerNib:forCellReuseIdentifier: or registerClass:forCellReuseIdentifier: method before calling this method.

(※UITableView Class Referenceより)

こんな感じで無事動きました。