在dismissModalViewControllerAnimated之后,父视图设置为全屏

Rap*_*ael 4 iphone cocoa-touch uikit

每次关闭ModalViewController后,父视图都设置为全屏.为什么?

Before                After
+----------------+   +------------------+
|head            |   | detailview       |
+----------------+   |                  |
|detailview      |   |                  |
|                |   |                  |
|                |   |                  |
|                |   |                  |
+----------------+   +------------------+
Run Code Online (Sandbox Code Playgroud)

我创建了一个"简单"的示例项目,出现错误.

http://github.com/rphl/modalTest

请看一下.

ima*_*boy 8

这有点猜测,但是在稍微使用了你的代码后,这是一个有根据的猜测.

当您呈现模态视图时,它将被添加为属于presentModalViewController被调用的控制器的视图的子视图.由于模态视图旨在全屏显示,因此看起来好像内部超视图的框架是全屏显示的.

我把以下内容放在你的MyDetailViewController中:

- (void)viewDidLoad {
    [super viewDidLoad];
    CGRect frame = self.navigationController.view.frame;
    NSLog(@"%@", NSStringFromCGRect(frame));
}

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    CGRect frame = self.navigationController.view.frame;
    NSLog(@"%@", NSStringFromCGRect(frame));
}
Run Code Online (Sandbox Code Playgroud)

这导致以下输出:

2010-09-19 00:23:51.823 ModalTest[2478:207] {{0, 164}, {320, 316}}
2010-09-19 00:23:56.178 ModalTest[2478:207] {{0, 0}, {320, 480}}
Run Code Online (Sandbox Code Playgroud)

第一行是在细节首次出现时输出的.当模态视图被解除时输出第二行.

现在我实际上并不特别喜欢我找到的解决方案,但这会产生预期的效果.在你的sendMail方法中:

ModalTestAppDelegate* appDelegate = [[UIApplication sharedApplication] delegate];
[appDelegate.viewController presentModalViewController:controller animated:YES];
Run Code Online (Sandbox Code Playgroud)

在你的mailComposeController:didFinishWithResulterror:方法中:

ModalTestAppDelegate* appDelegate = [[UIApplication sharedApplication] delegate];
[appDelegate.viewController dismissModalViewControllerAnimated:YES];
Run Code Online (Sandbox Code Playgroud)

基本上这可以确保它是全屏幕视图,保持应用程序的主UI呈现全屏模式视图.我不认为这是理想的,因为我并不是代码的深层部分的忠实粉丝.


小智 5

对我有用的东西是在模态视图控制器被关闭后恢复帧.代码示例:

提出模态视图控制器

[self presentModalViewController:self.modalViewController animated:YES];
Run Code Online (Sandbox Code Playgroud)

解雇模态视图控制器

CGRect frame = self.view.frame;
[self.modalViewController dismissModalViewControllerAnimated:YES];
self.view.frame = frame;
Run Code Online (Sandbox Code Playgroud)