ここ(OS Developer Library)には、色々なサンプルがあって便利です。
ちょっと前に「PageControl」がリリースされていたので、見てみましょう。
Upgraded to use iOS 6.0 SDK, UIWindow now uses rootViewController, now uses Automatic Reference Counting (ARC), updated to adopt current best practices for Objective-C.
「updated to adopt current best practices for Objective-C」に、とても興味が惹かれますね。
情報の「Download Sample Code」ボタンで、サンプルをダウンロードします。
ダウンロードしたら、すぐにビルド。
iPad用画面(左)、iPhone用画面(右)です。ページの遷移をコントロールするサンプルですね。
iPad用画面は、各ページをタイル状に表示して、クリックするたびに小窓を開く仕様のようです。
“小窓をもう1回クリックしたら全画面表示になる”ような工夫をしても良いかもしれません。
1.構造を眺める
「AppDelegate.m」を見ると、こうなっています。
ここで、iPhone、iPadのそれぞれのxibの読み替えをしています。
[[NSBundle mainBundle] loadNibNamed:nibTitle owner:self options:nil];
私はxibを使わない派なので、ここは書き換えなければなりません。が、充分参考になります。
「Resources」もソースコードもきれいに分離しています。手抜きはできないんですね。
2.重要そうなコードを見てみる
「ContentController.h」
#import@interface ContentController : NSObject @property (nonatomic, strong) NSArray *contentList; @end
「ContentController.m」
#import "ContentController.h" @implementation ContentController @end
ほとんど何も書かれていないのですが、
「PhoneContentController.h」
@interface PhoneContentController : ContentController
「PadContentController.h」
@interface PadContentController : ContentController
のように継承されて使われるものです。
iPhoneとiPadで共通に使うメソッドや変数やプロパティをここに書いておくのでしょう。
惜しい!
タイルも横4列に配置換えすればGood Job!だったのに・・・。
それはそれとして、小窓もちゃんと回転していますね。ここを見てみましょう。
小窓は「DetailPopoverViewController.m 」です。
ここに
// rotation support for iOS 5.x and earlier, note for iOS 6.0 and later this will not be called // #if __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_6_0 - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { return YES; } #endif
こんなことが書いてあります。
“Auto-Rotate”と読めるメソッド名から分かるように、「こいつで回転できるんだな」と思って間違いはありません。
しかし、気になる言葉がかいてあります。
「rotation support for iOS 5.x and earlier, note for iOS 6.0 and later this will not be called」
iOS6以降は、このメソッドは“callされない”のです。
なるほど、これがリリースノートに書かれていたポイントなのですね。
では、iOS6以後はどうすれば良いか?
- (BOOL)shouldAutorotate { return YES; }
と書けばいいのです(これ重要)。
しかし、このメソッドはこのサンプルコードには書かれていません。不親切ですねぇ。
- (BOOL)shouldAutorotateは初期値としてYESを戻すので、「NOを戻したい(=回転させたくない)」時だけ、オーバーライドすれば良いのです。
(自分のアプリなら、YESの時でもオーバーライドしておきますけどね。)
「shouldAutorotateToInterfaceOrientation」が「shouldAutorotate」に替わったことによる最大の変更点は、“引数がない”ということです。
「shouldAutorotateToInterfaceOrientation」は、“こんな回転状態”を引数にしていました。
「その回転状態になってよいかどうか」に対して「YES or NO」を戻していたのです。
「shouldAutorotate」に引数がないということは、“回転状態”を他の箇所で指定しなければなりません。
それは「info.plist」に書くことになっています。
ここに書いてある“回転状態”を許可しているのです。
このサンプルでは、「回転OK」かつ「常に、(すべての)回転状態をOK」としているので、
・「shouldAutorotate」をオーバーライドせず
・「info.plist」に書くだけ
ということになっています。
回転状態を細かく制御したい(ある画面の時はOK、ある画面の時はNGなど)場合は、
- (BOOL)shouldAutorotate - (NSUInteger)supportedInterfaceOrientations - (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
を「info.plist」と一緒に使うことになります。
ここら辺の詳細は、「AlternateViews」というサンプルをダウンロードすれば、確認できます。
「PageControl」のiPhone用画面は、UIScrollViewを使っているようですが、(私がxibを使わないので)今回は説明しません。
いずれ、コードで書いたサンプルを記事にしようかと思います。
ロゴスウェア
最新記事 by ロゴスウェア (全て見る)
- Amazon Linux(EC2)と PHPSTORM で Xdebug を行う - 2018年9月26日
- やらないことの合意 - 2018年6月27日
- 卒園アルバムとプロジェクトマネジメント - 2018年3月30日
Comments are closed.