为什么我的模态显示(表单)navController的rootViewController在模态呈现时不知道它的尺寸较小?

时间:2014-01-09 20:19:57

标签: ios cocoa-touch uiviewcontroller uinavigationcontroller modalviewcontroller

我正在开发一款带有几种不同模态视图的iPad应用程序,这段代码很常见:

UIViewController *v1 = [[UIViewController alloc] init];

UINavigationController *nav1 = [[UINavigationController alloc] initWithRootViewController:v1];
nav1.modalPresentationStyle = UIModalPresentationFormSheet;

[self presentViewController:nav1 animated:YES completion:nil];

可能是我做错了,但这就是我如何以模态方式呈现navController嵌套的vc。

问题是在v1类中,对self.frame / bounds的任何引用都会导致全屏尺寸:768x1024。即使navController显然没有以这样的尺寸显示。

我应该怎么做才能让v1 vc知道它实际有多大?所以,如果我想添加一个tableView,它会知道它应该有多大?

谢谢!

编辑:

我已经尝试了一些其他的东西,但仍然无法解决这个问题。我做了一个简单的示例项目来说明我遇到的问题。我只有一个视图,这是代码的核心:

- (void)viewDidLoad
{
[super viewDidLoad];

NSLog(@"Frame: %@", NSStringFromCGRect(self.view.frame));
NSLog(@"Bounds: %@", NSStringFromCGRect(self.view.bounds));

UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
button.frame = CGRectMake(self.view.frame.size.width - 400, 0, 400, 400);
button.backgroundColor = [UIColor redColor];
[button addTarget:self action:@selector(presentModal) forControlEvents:UIControlEventTouchUpInside];

[self.view addSubview:button];
}

- (void)presentModal {
SSViewController *view = [[SSViewController alloc] init];

UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:view];
nav.modalPresentationStyle = UIModalPresentationFormSheet;

[self.navigationController presentViewController:nav animated:YES completion:nil];
}

当这个视图加载时,我有一个红色的大按钮,它位于我视图的右上角。当我按下按钮时,它会在navController中嵌入的模态视图中加载相同的VC。由于框架没有改变,按钮几乎显示在屏幕外。它仍然显示为全屏。这是一个link to the project

3 个答案:

答案 0 :(得分:1)

这是iOS7的新功能。如果您在导航栏中嵌入UIViewController,它将不会变小,因为默认导航栏是半透明的。

如果您更改视图控制器的背景颜色,它会看到它,它的顶部实际上位于导航栏后面。

要在导航栏下方布置v1视图控制器,您可以使用以下代码:

if ([v1 respondsToSelector:@selector(edgesForExtendedLayout)]) {
    v1.edgesForExtendedLayout = UIRectEdgeNone;
}

它的行为与在iOS6中一样。

答案 1 :(得分:1)

不确定为什么你遇到了这个问题。我正在使用以下代码:

- (void)presentNewView {
    NewViewController *newVC = [[NewViewController alloc] initWithNibName:nil bundle:nil];
    newVC.view.backgroundColor = [UIColor redColor];

    UINavigationController *newNC = [[UINavigationController alloc] initWithRootViewController:newVC];
    newNC.modalPresentationStyle = UIModalPresentationFormSheet;

    [self.navigationController presentViewController:newNC animated:YES completion:NULL];
}

..它在模拟器中产生以下结果:

enter image description here

..当我打印出第一个ViewController的框架和边界时(我认为这可能是两个问题)我得到以下内容:

框架高度:1024.000000 框架宽度:768.000000 边界高度:1024.000000 边界宽度:768.000000

..当我打印出所呈现的ViewController的框架/边界时,我得到以下内容:

框架高度:620.000000 框架宽度:540.000000 边界高度:620.000000 边界宽度:540.000000

您如何准确确定框架的尺寸? v1类中以模态 SHOULD 呈现的任何引用都知道它的实际大小,就像我上面所示。

修改

我发现与我的代码和你的代码的主要区别在于,在我的代码中,我创建了我的视图控制器“NewViewController”的子类,并从该类中打印出框架。类本身似乎意识到它的正确边界,但是它所呈现的类似乎并非如此。通过从显示它的ViewController类打印view属性来演示这一点:

NewViewController的视图来自呈现类:frame =(0 0; 768 1024)

..与在NewViewController本身的ViewDidAppear方法中打印self.view相比:

NewViewController的View Does Appear:frame =(0 0; 540 576)

故事的道德,如果你要以你所展示的方式呈现UIViewController,你可能会想要继承UIViewController的子类,这样你可以根据需要自定义它,所以在那个文件中如果你引用self.view或self.bounds你将得到ACTUAL视图/边界。

编辑#2

根据您提供的项目,您遇到该问题的原因是您在viewDidLoad中打印出视图的框架/边界而不是viewDid / viewWillAppear。将这些NSLog语句添加到VWA或VDA可以为您提供正确的帧,正如我在初始编辑中所说的那样,您应该可以正确访问模式的视图。

答案 2 :(得分:1)

当从子视图控制器(一个小于全屏并且是另一个视图控制器的子项)的模式中呈现视图控制器时,重要的是这样做以便模态控制器知道画布的大小它出现在

childViewController.definesPresentationContext = YES; 
modalViewControllerWhichIsAboutToBePushed.modalPresentationStyle = UIModalPresentationCurrentContext