添加子视图myNavigationController.view时偏离20像素(y轴)

时间:2013-05-17 04:24:57

标签: ios objective-c xcode

我有一个带菜单按钮的导航控制器。按下菜单按钮时,当前视图(完成其导航栏)应向右滑动,菜单应同时并从左侧连续滑入。详细信息将在下面的代码中的注释中解释。

除一方面外,它有效。当添加回我实现的容器视图时,当前视图(在本例中为“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];

}];
}

以下是我的两个选项的说明(点击查看更高分辨率): visual

屏幕1)第一个屏幕在单击菜单按钮之前显示视图。

接下来的两个屏幕显示菜单转换动画开始时的两种可能性。

屏幕2)当我将presenter.frame.y.min设置为-20时,这就是转换的样子。如您所见,视图中的按钮上升了20个像素。

屏幕3)当我将presenter.frame.y.min设置为0时,这就是转换的样子。正如您所看到的,顶部有一个20像素高的条形图。蓝色表示容器视图。

1 个答案:

答案 0 :(得分:4)

前一段时间,当我没有正确创建视图控制器树时,我遇到了这个问题。我的20px关闭是因为添加UINavigationController视图作为子视图。那年我在WWDC的实验室里与Apple工程师进行了交谈。他们说我错误地使用了导航控制器,它需要是一个顶层构造,你不应该把它放在另一个UIViewController中。也就是说你可以将它们放在像UITabBarControllerUISplitViewController这样的容器视图控制器中。

您的问题不在您发布的代码中,而是在视图控制器的体系结构中。我已经向GitHub上传了一个示例应用,展示了如何创建一个&#34;幻灯片菜单&#34;像FaceBook和StackOverflow iPhone应用程序的应用程序。见https://github.com/GayleDDS/TestNavBarOffBy20.git

示例应用程序在根视图控制器中使用带有容器视图的故事板来管理UINavigationController(主视图)和UITableViewController(菜单视图)。

Storyboard

Main View现在显示菜单Slide for Menu

有关创建详细信息,请参阅提交消息cfb2efc。我从Single View Application模板开始,您需要添加QuartzCore框架。