— boreal-kiss.com

Archive
2010年5月 Monthly archive

Important note at July 05, 2010

It is found the problem below does not come from SDK but ME. Specifically when implementing UITabBarController, I’ve ignored to set its view’s autoresizesSubviews property to YES. The repository of BKTabBarController at github.com will be also closed soon.

——————- The original artice stats here. ——————-

SDK 3.2ではiPadをターゲットにした場合UITabBarControllerが正しく動作しない。具体的に言うと以下のような問題が発生する。

  • デバイスの回転が生じた際、配下のUIViewControllerのビューフレームが再配置されない。
  • 回転後に強制的に子ビューのフレームを変更すると、子ビュー中のボタン(UINabigationBarの場合右側ボタンのみ)が動作しなくなる。

全く同じ現象に悩んでいる人が他にもいたので自分の勘違いというわけではなさそうだ。

View controllers inside tab bar controller not auto-resizing on rotation – Stack Overflow

もし勘違いでないとすると結構な問題だ。というのもiPadではPortraitとLandscapeどちらのデバイス方向にも対応したアップリケーションでなければ提出できないのだが、UITabBarControllerを使った場合回転時に全く使い物にならないアプリケーションになってしまうからだ。

BKTabBarController

そこで上記問題点を解消するようなTabBarControllerクラスを作った。次回SDKアップデートでUITabBarControllerの不具合が修正されるまでは役立つと思う。UITabBarControllerと同じインターフェースで、現時点で実装してあるものを以下に示す(タブのカスタマイズ系は未実装)。

Properties / methods

@interface BKTabBarController : UIViewController {
 
}
 
@property (readonly, retain) UITabBar *tabBar;
@property (nonatomic, copy) NSArray *viewControllers;
@property (nonatomic, assign) NSUInteger selectedIndex;
@property (nonatomic, assign) UIViewController *selectedViewController;
@property (nonatomic, assign) id <BKTabBarControllerDelegate> delegate;
 
-(void)setViewControllers:(NSArray *)controllers animated:(BOOL)animated;
@end

Delegate

@protocol BKTabBarControllerDelegate <NSObject>
@optional
 
-(void)bkTabBarController:(BKTabBarController *)tabBarController 
	didSelectViewController:(UIViewController *)viewController;
-(BOOL)bkTabBarController:(BKTabBarController *)tabBarController
	shouldSelectViewController:(UIViewController *)viewController;
@end

ソースコードを含むサンプルプロジェクトとスタティックライブラリ化したライブラリは以下においてあるのでご自由にお使いください。