iPhone: отображать popOver из tabBarItem

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

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]];

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


person Bejil    schedule 04.07.2011    source источник


Ответы (3)


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

So I do :

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

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

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

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

person Bejil    schedule 07.07.2011
comment
Спасибо Беджилу. Я считаю это решение полезным для iPad. - person Jonats; 04.11.2011

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

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

[pop presentPopoverFromRect:CGRectMake(100,100,100,100) permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
person Brandon Schlenker    schedule 04.07.2011
comment
Спасибо, я сделал это в первую очередь, но не могу достучаться до фрейма tabBarItem. Я не знаю, как получить правильный CGRect - person Bejil; 05.07.2011

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

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

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

(gdb) po [[[[[UIApplication sharedApplication] delegate] tabBarController] view] recursiveDescription]
person Frank Schmitt    schedule 13.02.2012