2

各位大神,我是 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。

4

1 回答 1

0

So, if I could understand it, your problem is that your "a kind of" modal view is overridden you navigation bar 20px from the bottom, isn't it?

If yes, try to go to the NIB file of your "a kind of" modal view and check if the option "Status Bar" is with "none" selected. If it is like that, try to change to "Gray", for example.

I hope it will fix this issue, if not, let me know and I will try to see what it could be.

Cheers, VFN

于 2010-01-05T16:11:06.107 回答