Tag Archives: UITabBarController

[iPhone] UITabBarController에 아이콘 이미지 넣기

UITabBarController에 아이콘 이미지를 넣기 전까지는 어떻게 들어갈지 상상하기 힘듭니다.

그리고 보고 나면 왜 다른 어플들의 모습이 다 비슷비슷한지 다시 한번 느끼게 되는 결과를 얻게 됩니다.

[code]- (void)applicationDidFinishLaunching:(UIApplication *)application {
   
    UITabBarController *tabBarController = [[UITabBarController alloc] init];
    UIViewController *leftViewController = [[UIViewController alloc] init];
    UIViewController *rightViewController = [[UIViewController alloc] init];
   
    leftViewController.tabBarItem.title = @”LEFT”;
    rightViewController.tabBarItem.title = @”RIGHT”;
   
    leftViewController.tabBarItem.image = [UIImage imageNamed:@”test_a_01.png”];
    rightViewController.tabBarItem.image = [UIImage imageNamed:@”test_a_01.png”];
   
    NSArray *tabBarItems = [NSArray arrayWithObjects:leftViewController, rightViewController, nil];
   
    [tabBarController setViewControllers:tabBarItems];
   
    [window addSubview:tabBarController.view];
    [tabBarController.view release];
   
    [window makeKeyAndVisible];
}[/code]

위에서 사용하는 이미지는 다음과 같이 단순한 흰색의 이미지입니다. 알아보기 쉽게 하기 위해 배경에 회색을 깔았습니다.
사용자 삽입 이미지위에서 사용한 A 그림은 실제로는 배경이 투명한 이미지입니다. 그렇다면 실제로 완성된 탭바를 보도록 할까요.
사용자 삽입 이미지예상하신대로인가요? UITabBarController에서는 내가 넣은 이미지의 마스크(Mask)만을 사용하는 것을 알 수 있습니다.

선택된 이미지는 광택처리가 된(?) 하늘색 이미지로 바뀌며(자세히 보시면 그림자까지 들어가 있습니다) 비선택된 이미지는 회색으로 처리 되어있습니다.

이제 탭바를 쓴 앱스들의 아이콘이 모두 동일한 이유를 아시겠나요? 실제로 내가 원하는 이미지를 사용할 수 있도록 할수 있는 방법이 있습니다.

drawRect를 재구현 한다거나, 하지만 쉽고 간편하게 이런것을 구현할 수 있다는 점은 그냥 사용하게 만드는 매력을 가지고 있는 것 같습니다.
1108195223.zip

[iPhone] UITabBarController 이용시 UIViewController의 viewDidLoad가 호출되지 않는 문제 해결

UIViewController를 초기화 할때는 보통 다음과 같은 방식을 사용합니다.
[code]UIViewController *viewController = [[UIViewController alloc] init];[/code]
혹은 NIB를 이용한 다음과 같은 방법도 사용하게 됩니다.
[code]UIViewController *viewController = [[UIViewController alloc] initWithNibName:@”nibName” bundle:[NSBundle mainBundle]];[/code]
위와 같이 호출할 경우에는 자동으로 초기화가 되며 loadView, viewDidLoad가 순차적으로 호출되게 됩니다.

그런데 UITabBarController를 Interface Builder를 사용하여 다른 UIViewController를 등록하여 사용하게 되면 위의 두 메서드가 초기화시에 호출되지 않습니다.

또한 비슷한 컨트롤인 UINavigationController로 같은 문제를 가지고 있습니다. 이게 버그인지 무엇인지 잘 모르겠군요.

이런 난감한 문제를 해결하기 위해서 검색을 해보았지만 역시나 IB를 사용하지 않고 초기화 하는 방법밖에 없는 모양입니다.

[code]// UITabBarController 초기화
UITabBarController *tabBarController = [[UITabBarController alloc] init];
tabBarController.customizableViewControllers = nil;
 
// 3개의 다른 UIViewController 생성
// 3개의 뷰는 UINavigationView를 사용합니다.
UIViewController *View1 = [[UIViewController alloc] init];
UINavigationController *tab1Controller = [[UINavigationController alloc] initWithRootViewController:View1];
tab1Controller.tabBarItem.image = [UIImage imageNamed:@”1.png”];
[View1 release];
 
UIViewController *View2 = [[UIViewController alloc] init];
UINavigationController *tab2Controller = [[UINavigationController alloc] initWithRootViewController:View2];
tab2Controller.tabBarItem.image = [UIImage imageNamed:@”2.png”];
[View2 release];
 
UIViewController *View3 = [[UIViewController alloc] init];
UINavigationController *tab3Controller = [[UINavigationController alloc] initWithRootViewController:View3];
tab3Controller.tabBarItem.image = [UIImage imageNamed:@”3.png”];
[View3 release];
 
tabBarController.viewControllers = [NSArray arrayWithObjects: tab1Controller, tab2Controller, tab3Controller, nil];
 
[window addSubview: tabBarController.view];[/code]
위와 같은 방법을 사용하시면 정상적으로 작동하는 것을 알 수 있습니다.

참고  : http://discussions.apple.com/thread.jspa?threadID=1670615