模态视图控制器无法在横向模式下启动

时间:2010-09-22 17:34:50

标签: iphone xcode modalviewcontroller

我有一个基于导航的应用程序,它有一个详细视图(UIWebView),在UIToolbar的底部有操作按钮。我想在按下“音符”按钮时添加“音符”。当webview处于纵向模式时,一切正常。我按下音符按钮,模态视图打开很好,效果很好。

当webview处于横向模式时,会出现此问题。如果我按下音符按钮,所有打开模态视图的代码都会被调用,但我得到的只是一个白色屏幕。一条评论:如果我以纵向打开模态视图然后旋转设备,它会精细旋转到横向模式。它只是在横向模式下无法正确打开

我有另一个按钮,它会调出具有相同行为的邮件编辑器。这是我的UIWebViewController中的代码:

- (IBAction)addNotes:(id)sender 
{
    NotesViewController *notesViewController;

    // create the view controller and set it as the root view of a new navigation
    // controller

    notesViewController = [[NotesViewController alloc] initWithPrimaryKey:self.record.primaryKey];
    UINavigationController *newNavigationController =  
    [[UINavigationController alloc] initWithRootViewController:notesViewController];

    // present the navigation controller modally

    [self presentModalViewController:newNavigationController animated:YES];
    [notesViewController release]; 
    [self.view setNeedsDisplay]; // not sure if I need this!  I was trying different things...
    [self.devotionText setNeedsDisplay]; // ditto...
    [newNavigationController release];
}

有什么想法吗?我尝试过各种不同的东西都无济于事。我只是得到一个没有导航栏的白色屏幕(尽管顶部有一个状态栏)。

7 个答案:

答案 0 :(得分:7)

模态并不总是获取有关旋转的信息,并且它们从状态栏获取信息,这并不总是正常工作。把它放在你的viewWillAppear中修复:[UIApplication sharedApplication].statusBarOrientation = self.interfaceOrientation如果你想在你的模态中使用导航控制器,你需要创建一个。

此外,您不需要setNeedsDisplay。这只会影响当前的视图,而不会影响您呈现的模态。

答案 1 :(得分:4)

答案在这里:

https://stackoverflow.com/a/10250747/1449618

Use the window's root view controller to present:

[self.view.window.rootViewController presentViewController:masterView
                                                  animated:YES
                                                completion:NULL];

答案 2 :(得分:2)

哇,我在这个问题上失去了几天......但我找到了解决办法!

我遇到了同样的问题:方法“presentModalViewController:animated:”仅在纵向模式下工作。

经过大量的反复试验后,我发现原因是我有几个视图控制器同时处于活动状态。我实现了一个导航系统,它在不同的视图控制器之间切换,其中一个父级处理子级。 (我无法使用UINavigationController,因为我需要不同的外观。)

因此,我的根视图控制器有一个根视图对象和几个子视图控制器。激活子视图控制器后,其视图对象将作为子视图添加到根视图控制器的视图中。

“presentModalViewController”方法不喜欢这样。但是,只要我设置了子视图控制器的“parentViewController”属性,它就可以工作了!

问题只在于“parentViewController”是一个只读属性。您必须扩展UIViewController类,以便可以访问它。

@interface UIViewController (HelperExtension)

@property (nonatomic, assign) UIViewController *parent;

@end

@implementation UIViewController (HelperExtension)

- (UIViewController *)parent
{
    return self.parentViewController;
}

- (void)setParent:(UIViewController *)parent
{
    [self setValue:parent forKey:@"_parentViewController"];
}

@end

因此,每当您将子视图控制器的视图添加到父视图控制器时,请在执行此操作后调用“setParent:”方法。然后它会工作!

答案 3 :(得分:2)

在模拟导航控制器时出现同样的问题。一定要正确实现:shouldAutorotateToInterfaceOrientation

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
{
    BOOL shouldAutorotate = NO;
    if( isControllerMangingAllOrientations )
    {
        shouldAutorotate = YES;
    }
    else
    {
        shouldAutorotate = (toInterfaceOrientation == UIInterfaceOrientationPortrait);
    }
    return shouldAutorotate;
}

我在viewDidLoad方法中设置了布尔值,这不是一个好主意。将它放在initWithNibName:bundle:方法中是正确的位置。

答案 4 :(得分:0)

如果你像我这样的动画使用presentModalViewController,你可以使用带有动画的pushViewController,如下所示;

Showing pushviewcontroller animation look like presentModalViewController

你可以关闭viewController,如下所示;

CATransition* transition = [CATransition animation];
transition.duration = 0.3;
transition.type = kCATransitionFade;
transition.subtype = kCATransitionFromTop;

[self.navigationController.view.layer addAnimation:transition forKey:kCATransition];
[self.navigationController popViewControllerAnimated:NO];

希望有所帮助......

答案 5 :(得分:0)

我的任务是以横向模式显示视频播放器。

AVPlayerViewController *playerViewController = [AVPlayerViewController new];
//Player init code goes here....

// #define degreesToRadian(x) (M_PI * (x) / 180.0) - was defined previously in a class header

playerViewController.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
playerViewController.view.transform = CGAffineTransformMakeRotation(degreesToRadian(90));
playerViewController.view.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);

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

答案 6 :(得分:-1)

您不需要新的Navigation Controlle r。

- (IBAction)addNotes:(id)sender {

 NotesViewController *notesViewController;

 // create the view controller and set it as the root view of a new navigation
 // controller

 notesViewController = [[NotesViewController alloc] initWithPrimaryKey:self.record.primaryKey];

 [self.navigationController pushViewController: notesViewController animated: YES];
 [notesViewController release];
}