我放在一起,将显示所选择的UITabBarItem上方UIPopoverController的示例项目。
http://mobileoverlord.com/displaying-a-uipopovercontroller-from-a-uitabbaritem/
这包含了一点两轮牛车,因为你需要通过的TabBar的子视图进行迭代。此外,它可能会在iOS 5上不同,因为TabBar的背景视图在TabBar的子视图数组中。它在tabBarController委托方法中实现
- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController
{
NSInteger index = [[self tabBarController] selectedIndex];
CGRect buttonFrame = [[[[[self tabBarController] tabBar] subviews] objectAtIndex:index+1] frame];
PopOverViewController *popoverView = [PopOverViewController new];
popoverView.contentSizeForViewInPopover = CGSizeMake(250, 300);
popover = [[UIPopoverController alloc]initWithContentViewController:popoverView];
NSLog(@"X:%f Y:%f",buttonFrame.origin.x,buttonFrame.origin.y);
[popover presentPopoverFromRect:buttonFrame inView:self.tabBarController.tabBar permittedArrowDirections:UIPopoverArrowDirectionDown animated:YES];
}
以下是示例代码。随意评论和操纵。
https://github.com/mobileoverlord/UITabBarPopOver-Demo
如果你想将它限制为仅当某个按钮被按下,你可以过滤器的类传入viewController
像这样
- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController
{
if ([viewController isKindOfClass:[SecondViewController class]]) {
NSInteger index = [[self tabBarController] selectedIndex];
CGRect buttonFrame = [[[[[self tabBarController] tabBar] subviews] objectAtIndex:index+1] frame];
PopOverViewController *popoverView = [PopOverViewController new];
popoverView.contentSizeForViewInPopover = CGSizeMake(250, 300);
popover = [[UIPopoverController alloc]initWithContentViewController:popoverView];
NSLog(@"X:%f Y:%f",buttonFrame.origin.x,buttonFrame.origin.y);
[popover presentPopoverFromRect:buttonFrame inView:self.tabBarController.tabBar permittedArrowDirections:UIPopoverArrowDirectionDown animated:YES];
}
}
这对系统控制来说是一个相对意想不到的行为;不要忘了阅读HIG,并试着问自己在用户体验方面是什么样的...... – 2012-02-01 03:23:31