[iPhoneアプリ] PageControl


ここ(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で共通に使うメソッドや変数やプロパティをここに書いておくのでしょう。

3.遊んでみる
回転させてみましょう。

惜しい!
タイルも横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を使わないので)今回は説明しません。
いずれ、コードで書いたサンプルを記事にしようかと思います。

The following two tabs change content below.

谷中

システム開発チームと検証チームのマネージャー。 「疎結合 小さなクラス 分業制」 を裏スローガンとし、これが実現できてこそ、幸せな開発者人生を過ごせるという確信のもと、上流から設計まで口を挟んだり挟まなかったりしています。

Leave a Comment


NOTE - You can use these HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>