地図系アプリを作成中。
マーカーを好きな位置に出すことはできますが、info windowは出せないのかな?と調べたらあっさり解決法が見つかりました。
How to show a Info window in iOS Google maps without tapping on Marker? – Stack Overflow
GMSMarker *marker = [[GMSMarker alloc] init];
marker.position = coordinate;
marker.title = @”Location selected”;
marker.snippet = @”Testing”;
marker.map = mapView_;
//Show info window on map
[mapView_ setSelectedMarker:marker];
こんな風に、 setSelectedMarker でマーカーを選択してやればinfo windowが開きます。
当然かもしれませんが、複数のinfo windowを同時に出すことはできないようです。
ウインドウを複数出したいようなときは、UIViewで自作するしかないですかね。
SQLCipherというものを利用して、SQLiteを使ってデータを保存し、そのデータを暗号化しようとしている。
まず、こちらのサイトを参考にしながらサンプルアプリを作った。
chrooot: SQLCipherを使用してデータベースを暗号化する。(iOS)
乙寺備忘録 [iPhone]sqlcipherを利用する。(その2)
ここまでは上手くいっていたのだが、次に作成中のアプリにこの機能を組み込もうとしたときにトラブったのでメモ。
SQLCipherとopenSSLのライブラリを自分でbuildしなければならないので、自分のプロジェクトにSQLCipherとopenSSLのプロジェクトを組み込まなければならない。
そのために「Add Files to “自分のプロジェクト”」でサブプロジェクトとして登録するのだが、Addする際に「Destination: Copy items into destination group’s folder (if needed)」のチェックとしてもしなくても、コピーされなくて参照になるようだ。
私の場合、SQLCipherとopenSSLをサブプロジェクトに登録しても、なにやらプロジェクトとして認識されていないような状態になった。
サブプロジェクトのsqlcipher.xcodeprojをクリックしてもプロジェクトの情報が表示されないのだ。
それであれこれ操作を試していると、どうやらテスト用のサンプルアプリの方でSQLCipherのプロジェクトファイルを開いたままになっているので、他のアプリで開けない状態であることが分かった。両方から参照されている状態になっているらしい。
そこでサンプルアプリの方を閉じると正常に認識された。
結論
何かをサブプロジェクトとして登録するときには、そのプロジェクトファイルを他のアプリで開いていないことを確認しよう。
Localizable.strings (japanese)を編集していて、次のようなエラーに遭遇した。
Localizable.strings:0: error: read failed: The data couldn’t be read because it has been corrupted.
以前も見たことのあるエラーで、そのときは最後のセミコロンを忘れていたり、ダブルクオーテーションを忘れていた。
今回も同様の間違いだろうと一行ずつチェックしていったが見当たらない。
そこでファイルの後半半分を消してコンパイルしなおし、エラーがなければ後半4分の1を消してコンパイルというようなことを繰り返しエラーの行を特定した。
その行のエラーの原因は「 = の右側に全角空白がある」ことだった。
これはパッと見では分からないので中々発見し辛いエラーだった。
せめて行番号だけでも教えてくれればはかどるのに。
cocos2dで作っているアプリにAppBankの広告を載せようと思ったのだが、自力では無理なのでいつものようにgoogleで調べた。
参考になったというか、ほぼコピペで使わせてもらったのは以下のサイト。
cocos2dレイヤの上に広告を表示する – ICT Fractal 公式 blog
このサイトを参考にしつつ、広告を非表示にする際に、
[adView pause];
広告を再表示する際に、
[adView resume];
のような処理を追加した。
cocos2dを勉強しようと思って間違ってcocos2d-xの書籍を買ってしまって仕方なくcocos2d-xを勉強したのだが、その当時はgoogleで検索するとcocos2dのサンプルコードばかりが見つかるという状況だった。
そのため、せっかく書き慣れてきたobjective-cを捨て去るのもなんだし、cocos2dで行くか、とcocos2dのアプリを作り始めたのだが、あまりに開発速度が遅過ぎて、なんだか最近はcocos2d-xの検索結果の方が断然多くてcocos2dの情報を探すのに苦労するようになってきた。
全然時代の流れに着いていけてないです。
asset catalogなんてものがあることに最近気付いたくらいだし。
cocos2dでプログラミング中。
CCLabelTTFで指定できるフォント名の一覧を探していてこちらのページを見つけた。
[cocos2d] CCLabelTTFで利用出来るFontについて | きぶんはおっさん
どこかに一次ソースがあるんだろうけど見つけることができない。。。
macのFont Bookの中にあるフォントが全て使えるってわけでもないみたいでよくわからない。
2012年の情報のようだけど、これ以降変更はないんだろうか。
— 追記 —
どうやらここに書いてあるフォント一覧と同じらしい。
UIFont – iPhoneアプリ開発の虎の巻
上記のフォントはXcode3.2上で、familyNamesメソッドを使用して出力したフォント名を掲載しています。
と書いてあるので、CCLabelTTFではXcodeに入っている(iOSに含まれる?)フォントがそのまま使えるということでいいのかな?
AutoLayoutを使用しているとviewDidLoadの時点では、viewのframeが確定していないそうなのでメモ。
やりたかったのは、uiviewの初期位置を保存しておいて、uiviewを消し、後でその場所に再び表示さるというだけのこと。
なのだが、viewDidLoadの中でuiviewの初期位置を保存しておいて、後でその位置に表示しても同じ位置に復元できなかったのだ。
[iOS6] AutoLayoutを使用すると、viewWillAppear: でframeが決定しないので注意 | Zero4Racer PRO Developer’s Blog
こちらのサイトの情報によると、AutoLayoutを使用しているとviewDidLoad、viewWillAppearではframeが決定されないらしい。
で、どのタイミングでframeが決定しているのかというと、viewDidLayoutSubviewsの中では既に決定しているらしい。
というわけで、AutoLayoutを使用しているときにviewの位置を知りたいときには、viewDidLayoutSubviewsの中で調べるのが正解っぽい。
そもそも今までviewDidLayoutSubviewsというものの存在を知らなかったなぁ。
viewcontrollerにsubviewのレイアウトが完了したことを知らせるメソッドだそうで。
地図情報を使ったアプリを作ろうとしていて、google maps api for iOSやらiOSのMapKitやらyahooのiOSマップSDKやらテストしてみて、結局google mapsに落ち着いてコーディングしていた矢先に再び問題に直面。
少しパーティクル的なものを使ってみたいと思い、ちょこっと勉強したcocos2dを使ってやろうと思いしばらくコーディングしていたのだが、cocos2dの枠組みでgoogle mapを表示させるとどうも挙動がおかしい。
次のようなエラーが出て、地図が正常に表示されないことがある。
初回はほぼ正常に表示されるがsceneを移動して戻ってくると地図の縦横比がおかしくなったり、まったく地図が表示されなかったりする。
使い方が間違っている可能性も多々あるが、google map単体だと出なかったエラーなので、cocos2dと併用するときに何か問題が起こっているんだと思う。
Failed to make complete framebuffer object 0x8CDD
OpenGL error 0x0501 in -[CCSprite draw] 530
cocos2d iphone – Somethings wrong with GoogleMap SDK iOS – Stack Overflow
ここにある記事には、
「Google mapsはmapを表示するのにopenGL ESを使っている。それぞれ独自のGL contextを使うので、2つのOpenGLレンダラーは一緒には使えない。特にiOSの場合、2つのGLビューを並べて使うのをほとんどサポートしていないように思える(お互いのビュー上に置くなんてとんでもない)
どう見ても、cocos2dとgoogle mapsをiOS上で一緒に使うことはできません。」
というようなことが書いてある(と思う・・・)。
やっぱりcocos2dとgoogle maps api for iOSの併用は諦めなければいけないみたい。
結構がんばってコーディングしてたんだけど、cocos2dを使わないとなるとかなり作り直さないといけないなぁ。
MKMapViewのzoomには上限、下限の設定項目がありません。
そこで上限(や下限)を超えると、上限(下限)までアニメーションで戻してやる手法でみなさん上限、下限を付けているみたいです。
具体的には、 続きを読む
タイトルだけを見ても何を言っているのか分からないでしょうが。。。
[Xcode TIPS] UIViewのスクリーンショットを高画質でカメラロールに保存する方法 | ALOG | THE AGE
こちらのブログの記事にUIViewをそのまま画像として保存する方法が書かれています。
Retinaディスプレイの場合も高解像度で保存できます。
この記事では、スクリーンショットをライブラリに保存する方法が書かれています。
私はスクリーンショットをライブラリに保存するのではなく、UIImageになったスクリーンショットをUIImageViewに貼り付けそれを画面に貼付けたかったのです。
が、倍の解像度で記録された画像をそのまま画面に貼付けると画面からはみ出てしまい、画面には左上の1/4しか見えません。
そんなときは、以下のコードのようにscaleを変換してやればいいそうです。
img = [UIImage imageWithCGImage:img.CGImage scale:2 orientation:img.imageOrientation];
こちらを参考にしました。
iphone – Retina display and [UIImage initWithData] – Stack Overflow
UIPickerViewを使っていて、viewDidLoadの中で
[picker selectRow:lastRow inComponent:0 animated:NO];
のように最終行を選択させた状態を表示しようとすると、なぜか最終行の1個手前が選択された状態が表示されてしまう、という状況になりました。
環境はXcode4.6.3 で iOS6.0 iPhoneシミュレータです。
最終行以外の場合は正常に動いています。
で、調べてみたところ同じ状況に悩まされている方がいました。 続きを読む