忍者ブログ

[PR]

2024年03月19日
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

表示中のTabBarを回転させる

2010年04月26日
KigenをiPad対応にするために問題になったのが、標準のTabBarは表示中に回転しないということでした。でも、実はこの問題には簡単な解決方法があります。それはTabBarControllerのカスタムクラスを作り、それを回転対応にしてしまう事です。このように書くと何だか物凄い事をしているように思ってしまう人もいるかもしれませんが、実際の作業量は少ないです。

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を表示すると画面が回転しないとお困りの方、この方法で回転させても問題はありませんのでご安心ください。
PR

Tab Bar ControllerとNavigation Controller

2009年01月23日
Xcodeで新規作成時にTab Bar Applicationを選ぶと、画面の下にTab Barがあり、2つのビューを切り替えて表示できる状態になります。さて、ここでそれぞれのビューへの参照はどうすれば得られるのでしょう。これを考える時、Interface Builderがヒントになります。View Modeを中央のツリー表示に切り替えてみましょう。Tab Bar Controllerが一番上の階層にあります。その下にそれぞれのView Controllerがぶら下がっています。それぞれのView ControllerをNavigation Controllerに変えた場合には、Tab Bar Controllerが一番上にあるままで、その下がNavigation Controllerで、その下にView Controllerが配置されます。なお、Interface BuilderでのTab Bar Controllerは代表クラスにあるtabBarControllerのことです。それぞれのタブの項目は配列に格納されているので、例えば左から数えて2番目のタブの項目にあるView Controllerのid値は代表クラス内で表記するなら、

単なる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に置き換えて表記します。これまでに代表クラスのヘッダをインポートしていない場合には、忘れずにインポートしておきましょう。
 | HOME |