× [PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。 |
2種類ある。
UITabBarDelegateの - (void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item; UITabBarItem が引数で渡されてくる。 UITabBarController はすでにこのdelegateを実装している。 (ちなみに、ユーザがタップしてタブを選択したときにだけ呼び出される。プログラム上からタブを選択状態にしたときは呼ばれない) もう一つ UITabBarControllerDelegateの - (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController; こちらはUIViewControllerが引数になる。 UITabBarControllerはこのdelegateを実装していない。 UITabBarControllerを継承したクラスで使用したい場合は、UITabBarControllerDelegateを継承し、さらに
と記述すること。 そうすると、タブを選択したときに上記の2メソッドが両方呼ばれる。 PR |
UITabBarControllerを使うとき、タブアイテムに画像をセットすることがよくある。
普通、この画像はアイコンだけで、背景はグラフィックに持たせないことが多い。 ・端末によって画面サイズが違っていて、それに伴ってタブの縦横比も違っている。→分かりやすい解説ページ ・タブ数が変わると、1つのアイコンの横幅も変わる …というのが理由である。(当たり前) それでもアイコンに背景を付けたい、という人は 背景用画像をアイコン1つぶんの大きさにリサイズする。 で、[UITabBar appearance] の selectionIndicatorImage にセットする。
となる。 |
プロジェクト名を変える方法
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。 |
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 を実行。 参考 |