各位大神,我是 iPhone 和 Objective-C 的新手,有着悠久的程序语言背景。
我正在尝试模仿 Whole Foods 的食谱搜索功能。在该应用程序中,屏幕顶部有一个 NavigationBar,底部有一个 TabBar,屏幕顶部有一组三个按钮。选择一个按钮会从底部显示一个向上滑动的屏幕,覆盖 TabBar。上滑屏幕包含一个选择器和一个“完成”按钮。这不是一个模态屏幕,您可以从上面选择不同的按钮,并且选择器将动态更改。此外,这不是行动表。
在重新创建此行为时,我使用了 iPhone 的 ScrollViewSuite 示例中的 Autoscroll 项目来呈现一个非模态的上滑屏幕。这运作良好。我可以通过选择不同的按钮来动态更改上滑屏幕中的选择器。
由于我希望上滑屏幕覆盖 TabBar,因此我使用了来自http://osdir.com/ml/iPhoneSDKDevelopment/2009-01/msg00246.html的建议。简而言之,增加 tabBarController.view.frame 高度有效地使框架大于屏幕,并且 TabBar(锚定到底部)从用户视图中移除。上滑屏幕和隐藏 TabBar 的组合是可以接受的。生活相对美好。我需要做的就是添加 NavigationBar。
但是当我将 IB 中的屏幕从视图控制器更改为导航控制器屏幕时,我在隐藏 TabBar 时以某种方式在视图中引入了 20 像素的偏移!?NavigationBar 本身很好,但它下面的所有其他内容都会向上移动 20 像素。(不过,向上滑动的屏幕仍然很好。)(20 像素是 iPhone 状态栏的高度。)
我的 IB 是标准配置,有一个带有 TabBarCongroller 的 MainWindow.xib,以及其中的 NavigationControllers。
这是代码:
- (void)toggleThumbView
{
if (!thumbViewShowing)
{
[self createSlideUpViewIfNecessary]; // no-op if slideUpView has already been created
//Hide the TabBar, which introduces a 20 pixel shift up of everything except the navigation bar
UITabBar *ntoTabBar = self.tabBarController.tabBar;
CGRect tbcFrame = self.tabBarController.view.frame;
self.tabBarController.view.frame = CGRectMake(tbcFrame.origin.x ,
tbcFrame.origin.y ,
tbcFrame.size.width ,
tbcFrame.size.height + ntoTabBar.frame.size.height);
//The following code really doesn't matter for discussions about the problem, simply resizing the
//tabBarController.view.frame above has already introduced the 20 pixel problem
CGRect frame = [slideUpView frame];
frame.origin.y -= frame.size.height ;
frame.origin.y += ntoTabBar.frame.size.height ;
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.3];
[slideUpView setFrame:frame];
[UIView commitAnimations];
thumbViewShowing = !thumbViewShowing;
}
}
我尝试过使用 autoresizingMask 和 autoResizesSubviews。以下消除了 20 像素偏移:
[self.tabBarController.view setAutoresizesSubviews:NO];
不幸的是,它也使 TabBar 不会被隐藏。认为 20 像素可能是线索,我尝试取消选中所有 XIB 上的 IB '想要全屏',但无济于事。我已经检查并取消检查了 NIB 中的调整大小,并且我已经删除了所有模拟界面元素,以便程序应该控制调整大小(我相信那些模拟禁止程序控制?)再次,似乎什么都不是做的伎俩。将 tbcFrame.origin.y 增加 20 像素会消除屏幕偏移,但会导致 NavigationBar 降低 20 像素,覆盖下方的任何内容并在顶部留下可爱的 20 像素边距。问题出现在3.0 SDK模拟器,我升级到3.1.2。很高兴拥有最新/最好的,但它并没有解决我的问题。
如果我还没有秃顶,我会把头发拔掉。任何关于在哪里看的建议将不胜感激。通过单独的 ViewController 推送上滑视图并消除 TabBar 的编程隐藏会更好吗?就像是:
DetailViewController *dvc = [[DetailViewController alloc] init];
dvc.hidesBottomBarWhenPushed = YES;
[[self navigationController] pushViewController:dvc animated:YES];
[dvc release];
先感谢您,
鲍勃·B。