
既に開発が終了しているAMDのRenderMonkeyは、Windows上でOpenGLES2.0シェーダーをテストできるので便利なのだが、GeForce8系だとコンパイルは出来るがプレビューが見れない。
下記のようにすることで解決した。
//------------------------------------------------------------------------------
・nVidiaドライバエミュレーターをインストール (http://developer.nvidia.com/nvemulate)
・Feature Set Emulationを NV40に変更
・GLSL Compiler Device Supportを NV40に変更
・Applyボタンを押してRenderMonkeyを起動、GLESサンプルを試す
・RenderMonkeyを終了したら元に戻す
//------------------------------------------------------------------------------
最新のGeForceであればOpenGL4.1のES互換が使えると思うので、そちら経由でそのまま実行できるのかもしれない。
XCode4にしてからというもの、以前は正常に実行できていたプロジェクトが、
iPhoneシュミレータでの実行時に下記のエラーを吐くようになった。
No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=i386, VALID_ARCHS=armv7).
i386アーキテクチャの指定がないのが原因のようなので、
ビルド設定の [Valid Architectures] に [i386] を追記すると解決した。
[Architectures]のほうは変更しなくても問題ない模様。
新規にiOSのXcodeプロジェクトを作る際に、いつも使うライブラリ等のインポート設定などが面倒で、
横着して以前のプロジェクトをコピーして使いたくなる場合がある。
しかしこの作業を適当に勘でやると、アプリ実行時に[Unknown Error]が出て起動できなくなり
ハマる場合がよくあるので、備忘のために下記に正確な手順を書いておく。
iOSプロジェクトのコピーによる作成の手順/ XCode3版
( OldAppをコピー元のプロジェクトとする / NewAppをコピー後の新プロジェクトとする )
以上の手順で基本的には問題なくNewAppのアプリが立ち上がるはずだが、
それでも[Unknown Error]などが出る場合には、下記の点をよく確認する。
それでも駄目なら下記に[Unknown Error]の様々な対処法が書いてあるので参考に。
iPhoneプログラミングで、プログラムを変更し、起動し直したにも関わらず、
変更点が反映されていないことがある場合、考えられる原因は主に下記の2つ。
アプリのサスペンド機能がONになっている
iOS4.0以降から、ホームボタンでアプリを終了させた場合でも、
起動状態を維持する機能がデフォルトでONになるようになった。
これが悪さをしている場合があるので、info.plistに下記の設定を行い、この機能をOFFにしてみる。
<key>UIApplicationExitsOnSuspend</key>
<true/>
アプリのinfo.plistがターゲットのバンドルリソースに追加されている
info.plistの場所を変更し、再度プロジェクトに追加した場合などに、バンドルリソースに入ってしまうことがある。この場合、何故か2回目の起動時にもうひとつアプリがインストールされ、以前のアプリが立ち上がることがあるので削除する。
”Failed to launch simulated application: Unknown error.”
まれに上記のエラーが出て、iPhoneシュミレータがうんともすんとも言わなくなることがある。
何せ[Unknown error]なので、どうしようもないわけだけど、実際はいろいろな原因が考えられるようで。
今回の場合は、info.plistの[実行ファイル名]に、記号が入っていたのが原因だった。
[./\n\s]あたりの記号が入っていると上記エラーが起こる模様。
同様に、ターゲットのビルド設定の[プロダクト名]も、記号は受け付けない模様。
アプリケーションの表示名には使える記号も、使えない場合があるので注意。
その他の原因と解決方法はここにいろいろなレポートがある。
基本的にinfo.plist/Prefix.pchやファイル/フォルダ名が原因のことが多いようだ。
UIViewControllerを使いたくない主義のせいで、
Youtubeのフルスクリーンの制御で若干はまったのでメモ。
iPadではembedタグを利用することで、UIWebView内に普通にYoutubeプラグインを埋め込むことができる。
YoutubeをUIWebViewに埋め込むと、自動で再生ボタンや最大化ボタンが表示され、
最大化ボタンを押すと、勝手に最大化した画面を出してくれるし、
最小化ボタンを押すと、勝手に元の位置とサイズに戻してもくれるのだけれど、
自動で表示される最大化画面が、デバイスの回転に対応しなかったり位置がずれることがあった。
内部で実際にYoutubeを再生しているのはYoutubePluginという複合クラスのようなんだけど、
プライベートなクラスなので、容易には触れなかった。
Youtube再生画面内の最大化ボタンをタップした瞬間をフックできればいいのだけど、
それも上手くいかなかった。(UIWebView/YoutubePluginはタップのイベントを受け付けないので)
◇結論
デバイスの回転に対応するには
Youtubeを読み込むWebViewの親ビューのどこかでUIViewControllerを使う必要がある模様。
たとえばこんな感じで、「親ビューの階層内のどこか」でUIViewControllerを経由させる。
UIViewController *controller = [[UIViewController alloc] init];
controller.view = webParentView;
[self addSubview:[controller.view autorelease]];
WebViewの直近の親でControllerを使う必要はなくて、
むしろ後に最大化画面の位置とサイズを調整するためには、
なるべくUIWindowに近いところの親ビューをController経由にするほうがいい。
位置とサイズを調整するには
これはUIViewController経由でaddした「親ビューの」位置とサイズに従って追随する模様。
なのでUIDevice等から画面の回転イベントを受け取って、
Controllerを挟んだ親ビューの位置とサイズを調整すれば自動で追随してくれる。
UINavigationController等のコントローラーはなるべく使いたくない主義で、
画面の回転に対する処理をすべて自前で書いているような場合、下記の処理を書いておかないと、
UITextField等で自動でキーボードが表示される際に、Orientationが追随してくれない。
[[UIApplication sharedApplication] setStatusBarOrientation:orientation animated:NO];
UIKeyboardはステータスバーのOrientationによって表示する向きを変えている模様。
UIDeviceではないので注意。
今回はiPadのケースではまったんだけど、
iPhoneのときは普通に追随してたと思うんだけどなぁ...。
SQLiteライブラリのリンクの設定でちょっとはまったので備忘録に。
Linkingのエラーが出たら、ビルド設定の【Library Search Path】を確認し、別のパスが優先で指定されていたらその値を削除する
( このとき検索窓を使って設定を探す場合は、Showのところを【All Settings】にしておかないと、
独自定義した値しか表示されず混乱するので注意 )
要はXCodeが勝手にPath設定を追記して、他の環境のライブラリを優先指定しているのが原因。
libxmlなど、別のフレームワークや環境等にも含まれるdylibを指定する場合、同様の問題が起こる可能性がある。
自分の場合は、XAMPPのほうのlibsqliteが優先で指定されていて、
iPhone実機で動作させる際にリンクエラーが出た。
ちなみに、シミュレータと実機ではそれぞれ別のdylibを呼ばないといけないが、
通常は自動でXCodeが切り替えてくれるところを、自前で切り替えたい場合は、
下記のパスを【Library Search Path】に指定すれば良い。
/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator3.1.2.sdk/usr/lib
/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.1.2.sdk/usr/lib
備忘録:シュミレーター内に保存された写真は下記の場所に保存されている。
/User/ユーザー名/Library/Application Support/iPone Simulator/SDKバージョン/Media/DCIM/100APPLE
以下のような感じで、アプリ画面のスクリーンショットを撮ったりすると、高解像度の画像が得られて便利。
#import <QuartzCore/CALayer.h> - (void)getScreenShot { //現在のスクリーンショットを生成 CGRect screenRect = [[UIScreen mainScreen] bounds]; UIGraphicsBeginImageContext(screenRect.size); CGContextRef ctx = UIGraphicsGetCurrentContext(); [[UIColor blackColor] set]; CGContextFillRect(ctx, screenRect); [self.layer renderInContext:ctx]; NSData *pngData = UIImagePNGRepresentation( UIGraphicsGetImageFromCurrentImageContext()); UIImage *retImage = [[UIImage imageWithData:pngData] retain]; UIGraphicsEndImageContext(); //ローカルに保存 UIImageWriteToSavedPhotosAlbum(retImage, self, @selector(image:didFinishSavingWithError:contextInfo:), nil); } - (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void*)contextInfo { if (!error) { NSLog(@"Error %@", [error localizedDescription]); } }
iPhoneSDKのUIViewで親ビューのalpha値を変更すると、子ビューのalpha値も強制的に同じ値になってしまいますが、以下のようにすると子は親とは別の透明度を持つことが出来るようです。
駄目な例
UIView *oya = [[UIView alloc] init];
oya.alpha = 0.5f;
UIView *ko = [[UIView alloc] init];
ko.alpha = 1.0f;
[oya addSubview:ko]; //子の透明度は0.5fになる
良い例
UIView *oya = [[UIView alloc] init];
oya.backgroundcolor =
[UIColor colorWithRed:0.0f green:0.0f blue:0.0f alpha:0.5f];
UIView *ko = [[UIView alloc] init];
ko.backgroundcolor =
[UIColor colorWithRed:0.0f green:0.0f blue:0.0f alpha:1.0f];
[oya addSubview:ko]; //子の透明度は1.0fになる
要はUIViewのalphaではなく、UIColorのalphaで透明度を調節することが肝のようです。
これで画像を使わなくても透明度の違う複雑な見た目が簡単に作れるー。
(注:多用すると重くなるたぶん)
これさっき発見したんだけど、もしかして有名な話だったりするのかしら。