[PR]
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
表示中のTabBarを回転させる
1.まずTabBarControllerから派生したクラスを作成します。ここではRotatableTabBarControllerとします。
2.shouldAutorotateToInterfaceOrientation:でTabBarの下部にあるviewControllerにもshouldAutorotateToInterfaceOrientation:メッセージを送信させるようにする。
3.InterfaceBuilderでTabBarControllerのクラスをRotatableTabBarControllerに変更する。
これだけでTabBarが本体の傾きに合わせて回転します。以下にRotatableTabBarControllerのヘッダファイルとメソッドファイルのソースを掲載します。まずヘッダファイルから。
//
// RotatableTabBarController.h
//
// Created by Konton on 10/04/21.
// Copyright 2010 Konton. All rights reserved.
//
#import <UIKit/UIKit.h>
@interface RotatableTabBarController : UITabBarController {
}
@end
特に変更する部分は無いので空みたいなヘッダファイルです。次にメソッドファイルです。
//
// RotatableTabBarController.m
//
// Created by Konton on 10/04/21.
// Copyright 2010 Konton. All rights reserved.
//
#import "RotatableTabBarController.h"
@implementation RotatableTabBarController
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
for(UIViewController *controller in self.viewControllers) {
BOOL b;
b = [controller shouldAutorotateToInterfaceOrientation:interfaceOrientation];
}
return YES;
}
@end
メソッドファイルも単純で1つのメソッドが書かれているだけです。たったこれだけのソースで簡単に回転するTabBarになりますが、問題が起きる事もあります。表示の調整を各ViewControllerで行わせる際に、各ViewController自体が持つself.interfaceOrientationの値が正しい値になっていない事があることです。この問題には各ViewControllerにTabBarControllerから送られてきたinterfaceOrientationの値を保存する変数を作っておきshouldAutorotateToInterfaceOrientation:でその値を変更し、レイアウトの変更時にはそちらを参照するようにさせたり、直接RotatableTabBarController側のinterfaceOrientationを参照させることで対処可能です。回転させるとレイアウトが崩れる場合にはこのような対処が必要になります。
2010年4月30日追記:
この方法を使ってiPad上でTabBarを回転させていたKigen 2.1が無事承認されました。TabBarを表示すると画面が回転しないとお困りの方、この方法で回転させても問題はありませんのでご安心ください。
Tab Bar ControllerとNavigation Controller
単なるView Controllerの場合:
[[tabBarController viewControllers] objectAtIndex:1]
Navigation Controllerの場合で今表示中扱いのViewのController:
[(UINavigationController *)[[tabBarController viewControllers] objectAtIndex:1] topViewController]
という具合になります。じゃあ代表クラス外ならどうなるかというと、以前の記事に書いたように、
Tiny3DAppDelegate *appDelegate = (Tiny3DAppDelegate *)[[UIApplication sharedApplication]delegate];
というような感じでまず代表クラスの参照を得てから、先ほどのtabBarControllerをappDelegate.tabBarControllerに置き換えて表記します。これまでに代表クラスのヘッダをインポートしていない場合には、忘れずにインポートしておきましょう。