【问题标题】:iPhone : Display popOver from tabBarItemiPhone:从 tabBarItem 显示 popOver
【发布时间】:2011-07-04 22:29:05
【问题描述】:

我想知道如何从 tabBarItem 显示 popOver ? 以下是我管理 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]];

我想添加第五个项目,它会显示一个弹出框...有什么想法吗?谢谢

【问题讨论】:

    标签: iphone tabbar popover


    【解决方案1】:

    为了获得我的 UITabBarItem 框架,我注意到在 iPad 上(在 iPhone 上,项目是 autorisizingWidth 它更简单)项目的宽度为 75 像素,间距为 34 像素。

    所以我这样做了:

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

    获得第一个灵活的空间宽度。 然后我添加:

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

    获取项目的宽度中心。

    【讨论】:

    • 感谢贝吉尔。我发现这个解决方案对 iPad 很有用。
    【解决方案2】:

    我建议不要这样做,因为这不是标签栏的预期行为。但是,您可以创建一个 UIPopoverController 并使用 presentPopoverFromRect 显示它。

    UIPopoverController *pop = [[UIPopoverController alloc] initWithContentViewController:someVC];
    
    [pop presentPopoverFromRect:CGRectMake(100,100,100,100) permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
    

    【讨论】:

    • 谢谢,这是我首先做的,但我无法到达 tabBarItem 框架。我不知道如何获得正确的 CGRect
    【解决方案3】:

    您可以爬取选项卡栏的视图层次结构并查找 UIControl 子类(它们可能以随机顺序出现,因此您需要按照最左边的center.x 对它们进行排序)。每个都是一个标签栏按钮,它将有一个矩形。

    这种方法似乎属于 App Store 安全编码领域,尤其是当您退回到仅使用标签栏的 frame 时,如果操作系统升级破坏了您的代码。

    UIView 有一个方便的未记录方法,称为recursiveDescription,它对调试非常有用。例如:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-09-28
      • 2011-02-15
      • 1970-01-01
      • 1970-01-01
      • 2017-01-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多