我有一个带菜单按钮的导航控制器。按下菜单按钮时,当前视图(完成其导航栏)应向右滑动,菜单应同时并从左侧连续滑入。详细信息将在下面的代码中的注释中解释。
除一方面外,它有效。当添加回我实现的容器视图时,当前视图(在本例中为“Conversations”)必须将其框架设置为“y.min”= - 20,否则其导航栏上方有20个像素。但是,当我将其y.min设置为-20时,会将其视图中的所有内容向上移动20个像素。因此,当按下菜单按钮时,当前视图中的所有内容都会突然向上跳跃20个像素。
我无法弄清楚为什么会发生这种情况或如何解决这个问题。还有一种更简单的方法可以解决所有这些问题,但我不知道一个。*(*我对第三方文件不感兴趣。我想学习自己这样做。)< / p>
以下是代码:
- (IBAction) showMenu:(id)sender
{
// get pointer to app delegate, which contains property for menu pointer
AppDelegate *appDelegate = getAppDelegate;
//create container view so that current view, along with its navigation bar, can be displayed alongside menu
UIView *container = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 320.0f, 548.0f)];
[container setBackgroundColor:[UIColor blueColor]];
//before presenting menu, create pointer for current view, to be used in completion routine
UIView *presenter = self.navigationController.view;
//present menu's VC. it is necessary to present its (table) VC, not just add its view, to retain the functionality of its cells
[self presentViewController:appDelegate.menuVC animated:NO completion: ^{
//obtain a pointer to the menu VC's view
UIView *menuTemp = appDelegate.menuVC.view;
//replace menu VC's view with the empty container view
appDelegate.menuVC.view = container;
//add the menu view to the container view and set its frame off screen
[container addSubview:menuTemp];
menuTemp.frame = CGRectMake(-260.0f, 0.0f, 260.0f, 548.0f);
//add the the view that was displayed when the user pressed the menu button. set its frame to fill the screen as normal
[appDelegate.menuVC.view addSubview:presenter];
presenter.frame = CGRectMake(0.0f, 0.0f, 320.0f, 548.0f);
//animate the 2 subviews that were just added; "PRESENTER"'S FRAME IS THE ISSUE
[UIView animateWithDuration:25.3f delay:0.0f options:nil animations:^{
[menuTemp setFrame:CGRectMake(0.0f, 0.0f, 260.0f, 548.0f)];
[presenter setFrame:CGRectMake(260.0f, -20.0/* or 0 */f, 320.0f, 548.0f)];
} completion:nil];
}];
}
屏幕1)第一个屏幕在单击菜单按钮之前显示视图。
接下来的两个屏幕显示菜单转换动画开始时的两种可能性。
屏幕2)当我将presenter.frame.y.min设置为-20时,这就是转换的样子。如您所见,视图中的按钮上升了20个像素。
屏幕3)当我将presenter.frame.y.min设置为0时,这就是转换的样子。正如您所看到的,顶部有一个20像素高的条形图。蓝色表示容器视图。
答案 0 :(得分:4)
前一段时间,当我没有正确创建视图控制器树时,我遇到了这个问题。我的20px关闭是因为添加UINavigationController
视图作为子视图。那年我在WWDC的实验室里与Apple工程师进行了交谈。他们说我错误地使用了导航控制器,它需要是一个顶层构造,你不应该把它放在另一个UIViewController
中。也就是说你可以将它们放在像UITabBarController
和UISplitViewController
这样的容器视图控制器中。
您的问题不在您发布的代码中,而是在视图控制器的体系结构中。我已经向GitHub上传了一个示例应用,展示了如何创建一个&#34;幻灯片菜单&#34;像FaceBook和StackOverflow iPhone应用程序的应用程序。见https://github.com/GayleDDS/TestNavBarOffBy20.git
示例应用程序在根视图控制器中使用带有容器视图的故事板来管理UINavigationController(主视图)和UITableViewController(菜单视图)。
现在显示菜单
有关创建详细信息,请参阅提交消息cfb2efc。我从Single View Application
模板开始,您需要添加QuartzCore
框架。