iPhone: Показване на изскачащ прозорец от 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, това е по-просто) елементите са с ширина 75px и са разположени на 34px.

So I do :

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

за да получите първата гъвкава ширина на sapce. След това добавям:

(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