我正在开发一款带有几种不同模态视图的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。
答案 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];
}
..它在模拟器中产生以下结果:
..当我打印出第一个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