2011-07-04 3 views
0

Интересно, как я могу отображать popOver из tabBarItem? Вот как я могу управлять своим tabBarController:iPhone: Показать popOver от tabBarItem

tabBarController = [[UITabBarController alloc] init]; 

searchSplitViewController = [[UISplitViewController alloc] init]; 
searchRoot = [[[EI_iPad_Home_Root_ViewController alloc] init] autorelease]; 
searchDetail = [[[EI_iPad_Home_Detail_ViewController alloc] init] autorelease]; 
searchRootNav = [[[EI_Navigation_ViewController alloc] initWithRootViewController:searchRoot]autorelease]; 
searchDetailNav = [[[EI_Navigation_ViewController alloc] initWithRootViewController:searchDetail] autorelease]; 
searchSplitViewController.viewControllers = [NSArray arrayWithObjects:searchRootNav, searchDetailNav, nil]; 
searchSplitViewController.delegate = searchDetail; 

favoritesSplitViewController = [[UISplitViewController alloc] init]; 
favoritesRoot = [[[EI_iPad_Favorites_Root_ViewController alloc] init] autorelease]; 
favoritesDetail = [[[EI_iPad_Favorites_GeneralDetail_ViewController alloc] init] autorelease]; 
favoritesRootNav = [[[EI_Navigation_ViewController alloc] initWithRootViewController:favoritesRoot]autorelease]; 
favoritesDetailNav = [[[EI_Navigation_ViewController alloc] initWithRootViewController:favoritesDetail] autorelease]; 
favoritesSplitViewController.viewControllers = [NSArray arrayWithObjects:favoritesRootNav, favoritesDetailNav, nil]; 
favoritesSplitViewController.delegate = favoritesDetail; 

agencySplitViewController = [[UISplitViewController alloc] init]; 
agencyRoot = [[[EI_iPad_Agency_Root_ViewController alloc] init] autorelease]; 
agencyDetail = [[[EI_iPad_Agency_GeneralDetail_ViewController alloc] init] autorelease]; 
agencyRootNav = [[[EI_Navigation_ViewController alloc] initWithRootViewController:agencyRoot]autorelease]; 
agencyDetailNav = [[[EI_Navigation_ViewController alloc] initWithRootViewController:agencyDetail] autorelease]; 
agencySplitViewController.viewControllers = [NSArray arrayWithObjects:agencyRootNav, agencyDetailNav, nil]; 
agencySplitViewController.delegate = agencyDetail; 

editoSplitViewController = [[UISplitViewController alloc] init]; 
editoRoot = [[[EI_iPad_News_Root_ViewController alloc] init] autorelease]; 
editoDetail = [[[EI_iPad_News_Detail_ViewController alloc] init] autorelease]; 
editoRootNav = [[[EI_Navigation_ViewController alloc] initWithRootViewController:editoRoot]autorelease]; 
editoDetailNav = [[[EI_Navigation_ViewController alloc] initWithRootViewController:editoDetail] autorelease]; 
editoSplitViewController.viewControllers = [NSArray arrayWithObjects:editoRootNav, editoDetailNav, nil]; 
editoSplitViewController.delegate = editoDetail; 

searchSplitViewController.tabBarItem.title = NSLocalizedString(@"TabBar_search_label",nil); 
searchSplitViewController.tabBarItem.image = [UIImage imageNamed:@"tabBar_search_icon.png"]; 

favoritesSplitViewController.tabBarItem.title = NSLocalizedString(@"TabBar_favorite_label",nil); 
favoritesSplitViewController.tabBarItem.image = [UIImage imageNamed:@"tabBar_favorite_icon.png"]; 

agencySplitViewController.tabBarItem.title = NSLocalizedString(@"TabBar_agencies_label",nil); 
agencySplitViewController.tabBarItem.image = [UIImage imageNamed:@"tabBar_agencies_icon.png"]; 

editoSplitViewController.tabBarItem.title = NSLocalizedString(@"TabBar_news_label",nil); 
editoSplitViewController.tabBarItem.image = [UIImage imageNamed:@"tabBar_news_icon.png"]; 

tabBarController.viewControllers = [NSArray arrayWithObjects:searchSplitViewController,favoritesSplitViewController,agencySplitViewController,editoSplitViewController,nil]; 
[window addSubview:[tabBarController view]]; 

Я хочу, чтобы добавить пятый элемент, который будет отображать поповер ... какие-либо идеи? Спасибо

ответ

1

Чтобы получить мой UITabBarItem кадр я заметил, что на IPad (на iPhone пункты autorisizingWidth это более простые) элементы 75px шириной и отстоят друг от друга 34px.

Так что я:

(tabBar.frame.size.width-((75*[tabBarController.items count])+(34*[tabBarController.items count]-1)))/2 

, чтобы получить первую гибкую ширину пробела. Затем я добавляю:

(75*indexOfItemToReach)+(34*(indexOfItemToReach-1))+(75/2) 

Чтобы получить ширину центра пункта.

+0

Спасибо Bejil. Я нахожу это решение полезным для iPad. – Jonats

0

Я бы советовал об этом, потому что это не ожидаемое поведение для панели вкладок. Однако вы можете создать UIPopoverController и отобразить его с помощью presentPopoverFromRect.

UIPopoverController *pop = [[UIPopoverController alloc] initWithContentViewController:someVC]; 

[pop presentPopoverFromRect:CGRectMake(100,100,100,100) permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES]; 
+0

Спасибо, это то, что я сделал первым, но я не могу добраться до рамки tabBarItem. Я не знаю, как получить правильный CGRect – Bejil

0

Вы можете сканировать иерархию представлений панели вкладок и искать подклассы UIControl (они могут возникать в случайном порядке, поэтому вам нужно отсортировать их, с помощью которых center.x является самым левым). Каждый из них представляет собой кнопку панели вкладок, которая будет иметь прямоугольник.

Этот подход, похоже, входит в сферу безопасного хранения в App Store, особенно если вы вернетесь только к использованию панели вкладок frame, если обновление ОС нарушает ваш код.

UIView имеет удобный недокументированный метод под названием recursiveDescription, который невероятно полезен для отладки. Например:

(gdb) po [[[[[UIApplication sharedApplication] delegate] tabBarController] view] recursiveDescription] 

 Смежные вопросы

  • Нет связанных вопросов^_^