× [PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。 |
なんで2.2か、という話でもあるが。
まずAndroidの環境設定(これ書くの何回目?) 参考 まずandroidとeclipseダウンロード 公式からダウンロード 展開。この時点でeclipseは起動する。 次にNDKインストール。 公式からダウンロード これ、このままだと展開できない。 $ chmod a+x android-ndk-r10c-darwin-x86_64.bin $ ./android-ndk-r10c-darwin-x86_64.bin とすると展開できる。 android-ndk-r10c/ のようなディレクトリができるので、どっかに置いておく。 ここまででandroidは終了 cocosのインストールを行う(割愛) 以下のシェルスクリプトを実行 $ PROJ_NAME/cocos2d-x-2.2.4/projects/PROJ_NAME/proj.android/build_native.sh これをすると、 proj.android/libs/armeabi/libcocos2dcpp.so というライブラリが生成される。 これがないと、C++ネイティブのcocosの機能が使えないので。 ちなみにこれをロードするには、 MainActivity.javaに以下のように記述する。
ここまでやったら、eclipseを起動する。 該当のプロジェクトを開く。 File->New->Other->Android->Android Project from Existing Code->Next ブラウザからディレクトリ指定。 プロジェクトが開くのを確認。 さらに、cocos2dxのプロジェクトも開く。 該当のプロジェクトから、プロパティを開き、Androidタブを開く。 ライブラリの設定が外れていると思うので、再度設定。 PR |
プロジェクト名を変える方法
1.プロジェクト名を変える プロジェクトナビゲータでプロジェクトファイルをクリック。 右上に Identity and Type というペインが表示され、その先頭に Name 欄がある。 これを書き換える。 するとプロジェクト名が変わる。 old.xcodeproj/ ディレクトリが new.xcodeproj/ に変わる。gitコミットする場合はここの追加・削除を忘れずに 2. ターゲット名を変える 同じ画面で、 TARGETS の名前欄をクリックし、そのまま変更する。 3. スキーム名を変える スキームを選択し、Manage Schemesをクリック。 スキーム一覧が出るので、名前部分をクリックし、そのまま変更する。 スキームをシェア設定していなければ、スキーム情報はgit管理下に置かれないので、特にコミットの必要は発生しない。 シェアしていれば、 projname.xcodeproj/project.xcworkspace/xcshareddata/old.xcscheme を削除し projname.xcodeproj/project.xcworkspace/xcshareddata/new.xcscheme を追加するコミットが必要。 |
座標系を、別のビュー相対座標に変換する方法
CGRect convertedView = [view convertRect:view.bounds toView:otherView]; これでRectをotherView相対に変換できる。 boundsとframeの違いに注意。もちろんどちらもCGRectなので使えるが、間違えないよう注意。 (boundsはそのビューの座標系。frameはそのビューの親ビューの座標系。 よってboundsのoriginは常に(0,0)になっている) 普通はboundsを使うことになるだろう。 ちなみに、toView を nil にすると 画面相対の座標が手に入る。便利! ちなみに、CGRectでなくCGPointもある。 UIViewのメソッド - (CGPoint)convertPoint:(CGPoint)point toView:(UIView *)view; - (CGPoint)convertPoint:(CGPoint)point fromView:(UIView *)view; - (CGRect)convertRect:(CGRect)rect toView:(UIView *)view; - (CGRect)convertRect:(CGRect)rect fromView:(UIView *)view; ビュー相対でなく、ウィンドウ相対で変換できる同様のメソッドもある。 UIWindowのメソッド - (CGPoint)convertPoint:(CGPoint)point toWindow:(UIWindow *)window; - (CGPoint)convertPoint:(CGPoint)point fromWindow:(UIWindow *)window; - (CGRect)convertRect:(CGRect)rect toWindow:(UIWindow *)window; - (CGRect)convertRect:(CGRect)rect fromWindow:(UIWindow *)window; メインウィンドウを取得するには
とする。(大抵の場合、AppDelegateにwindowインスタンスがあるので) ただし、一度これで変換してみたところ全然違う座標に変換されて返ってきた。原因は深く追ってないが。 スクリーン座標が欲しいときは、 convertRect:toView: で引数を nil にするのが早い。 |
あるMacで証明書を作成し、それを含むprovisioning profileを作ったとする。
その証明書を別のMacで使いたいときの手順。 ※別のMacで新たに証明書を作成すればいいのだが、それができないときの方法。 ーーどんなときに証明書作成ができないかというと、例えばios dev centerの管理者が自分でなく、たとえ新しいCSRをMacで作成しても証明書の発行がios dev center上で自由にできないとか。 ・コピーするもの 証明書の秘密鍵(証明書自体はたぶん不要。もし失敗したら証明書もコピーしてみよう) .p12で書き出す(.cerでもいいかも) これをAirDropなどで、もう一つのMacに転送。 受け取ったMacのほうでは、このファイルをダブルクリックしてキーチェーンアクセスに登録。 これでOK。 |
git-hubやgit-labでssh接続する手順
httpだとらくちんなんだけど、リポジトリが大きすぎると取って来れないことがある とりあえずzipで落としてこようとか思っても、ファイルがでかすぎて応答時間限界を超えてサーバがエラーを返したり。。 秘密鍵、公開鍵を作成 $ ssh-keygen -t rsa -C xxx@example.com 最後はメアド。 対話式に、書き出すファイル名を聞かれるので入力する github_key とかにすると、 github_key(秘密鍵) github_key.pub(公開鍵) が作成される。 秘密鍵に $ chmod 600 github_key を忘れずに(そのままでなってると思うけど) さらに移動しておく $ mv github_key ~/.ssh/ で、.ssh/configに以下を記述 Host host User git HostName xxx.xxx.xxx.xxx TCPKeepAlive yes identitiesonly yes IdentityFile ~/.ssh/github_key Hostの名前は分かりやすければなんでもいい Userはgitにすること。(git-hubへのコマンドは全部ユーザ名gitでやるので) さらに、キーを永続的に登録するため、以下のコマンドが必要になることがある $ ssh-add -K .ssh/gitlab_key ここが重要。知らなかった で、接続できるはず $ git clone git@example.co.jp:path/to/repository.git 大きすぎるときは $ git clone --depth 1 git@example.co.jp:path/to/repository.git とかをすると階層を限定して取って来れる。 で、あとはこんな感じで取ってくる $ git fetch --depth 10 $ git fetch --depth 100 # 値は調整しつつ $ git fetch --unshallow # 最後に全部落とす このオプションは最新のgitでないとない 参考 ちなみに、単にssh接続を確認したいときは $ ssh -vT git@example.co.jp とか。-vオプションをつけるとデバッグ表示する (ただし、sshが繋がってもgitが取って来れないときもある) |
UIViewのメソッドに
layoutSubviews というのがある。 意識することはないのだが、ビューの再描画を行うメソッドで、 このメソッドが実行される前後で、ビューコントローラの viewWillLayoutSubviews viewDidLayoutSubviews というメソッドが呼ばれる。 この2つのメソッドはオーバーライドしてよい。 UIView の layoutSubviews UIViewController の viewWill/DidLayoutSubviews ・layoutSubviewsはどんなときに実行されるか はっきりと定義はされておらず、いろんな人が自分で実験した結果を書いていたりする 参考 によると ・addSubviewをすると、親になったビューとその子孫ビューすべてにlayoutSubviewsが実行される ・setFrameをしたとき(ただしサイズが変化していなければ呼ばれない) ・スクロールすると、スクロールビューとその親ビューに対して呼ばれる ・デバイスを回転したとき、ビューコントローラのプライマリビューに対して呼ばれる ・ビューをリサイズすると、その親ビューに対して呼ばれる ・他にテーブルビューのrowAnimationをしたとき、アニメーションが終了したときにも呼ばれる ・init時は呼ばれない という感じでいろいろあり、すべて把握するのは無理と思われる。 で、ストーリーボードでなくコードでなんらかのビューのサイズを変更してたりすると、layoutSubviewsが呼ばれたときに元のサイズに戻されたりする。 だから、ビューのframeを変更するような処理はviewDidLayoutSubviewsで呼ぶのが適切。 しかも、何回呼ばれても問題ないように作っておく必要がある。
ここでは、viewDidLayoutSubviewsで行う内容をupdateViewsというメソッドに一応出している。 このメソッドは外から呼ばない。(だったら直接viewDidLayoutSubviewsに書いちゃってもいいような気がしている) 呼びたいとき(ビューの表示内容を変更する必要があるとき)は、 [self.view setNeedsLayout] を呼ぶ。 これをすると、次のタイミングで layoutSubviewsが呼ばれ、viewDidLayoutSubviewsも呼ばれる。 似たようなメソッドで [self.view layoutIfNeeded] もあるが、これは強制呼び出しにならない。最描画の必要がある場合だけlayoutSubviewsが実行される(どういうときかはまだ把握してない)。うまく使い分けよう。 アニメーションはviewDidLayoutSubviewsではしない。 アニメーションの必要が発生した瞬間に呼び出す。それが自然だしそれで行ける。 |
rowHeightiOS8からは、セルの高さの計算方法が変わったらしい。ストーリーボードでtableViewにrowHeightが指定できるが、 実行時には値が-1になっている。 これは UITableViewAutomaticDimension という定数値で、セル高さを自動計算する設定ということだ。 viewDidLoadで
という感じで設定すれば良い。 そうすると他のコード中でもrowHeightが使えるようになり、 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath; をオーバーライドしなくてもよくなる。 セル高さが常に同じなら、tableView:heightForRowAtIndexPath: を実装するより、rowHeightを定義したほうが早い。と思う。 他に estimatedRowHeight というプロパティもある。 詳しくは テーブルビューの中身のサイズテーブルビューはスクロールビューでもある。つまり、UITableViewはUIScrollViewの子クラスである。 だから、UIScrollViewで使えるプロパティやメソッドはUITableViewでも使える。 ストーリーボードでも設定項目がちゃんとある。 だから、テーブルビューのセルとセクションを含めた中身全体のサイズは、
で取得することができる。heightForRowAtIndexPath とか heightForHeaderInSection とかのメソッドを使う必要は無い。 追加・削除アニメーションと中身のサイズinsertRowsAtIndexPaths: withRowAnimation:で追加するとき、contentSizeは 追加前の値のままである。 アニメーションが終わったとき、追加後のサイズになる。 deleteRowsAtIndexPaths: withRowAnimation: も同様。 追加・削除指定の注意セルの追加や削除をするとき、データソースの変更とセルの変更を一緒に行う。基本的にデータソースが先である。
当然だが、データソースに追加するindexと、セル位置を指定するrowAtIndexは整合が取れていないといけない。つまり tableView: cellForRowAtIndexPath: が返す物と同じであること。 追加・削除しても、当該のセル以外は再描画しないで位置だけ移動する。 行の削除、セクションの削除行・セクションを削除するメソッドは
となる。 注意点 deleteRows の結果、セクション内の行が0行になると実行時エラーになる。 0行になるときは、 deleteSections を実行すること。(deleteRowsは実行しないこと) |
|
タッチを検知したいとき、ビューコントローラに実装するのは簡単。
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event; - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event; - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event; - (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event; この4メソッドをビューコントローラに実装するだけ。 ただ単にソースファイルに書くだけ。delegateの指定なども不要。 このメソッドは UIResponder に定義されている。UIViewControllerはその子孫クラスなので、そのまま書いてオーバーライドできる。 たとえば、テキストフィールド以外をタッチしたときにキーボードを閉じたいときは 以下のように実装する。
スクロールビューとタッチイベントスクロールビューを使っているときは、タッチイベントが受け取れない。(メソッドが呼ばれない) スクロールビューがタッチイベントを受け取り(スクロール処理のため)、タッチイベントが子ビューに伝播されないためだ。 つまり、スクロールビューがfirstResponderになっている。 これに対処するためには、スクロールビューのタッチイベントを受け取ったとき、次のレスポンダーにイベントを伝播すればいいので UIScrollViewのタッチイベントメソッドを実装すればいい。UIScrollViewはもちろん既存のクラスなので、カテゴリー拡張を使う。
という感じである。 これをプロジェクトに追加し、スクロールビューを使っているすべてのファイルからインポートすればいい。 ただそれは面倒だし忘れそうなので、Prefixファイルに書いておくのがよいだろう。
pchファイルに付いては別記事で。 |
インストールの仕方
最初のセットアップ $ sudo gem install cocoapods $ pod setup プロジェクトごとの設定 プロジェクトのルートディレクトリ(xxx.xcodeprojのあるディレクトリ)に移動し Podfileという名前のファイルを作成する
そして $ pod install これでよし。 次回以降、Podfileを書き換えたときは $ pod update を実行。 参考 |