6

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

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

我有另一个按钮可以调出具有相同行为的邮件编写器。这是我的 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];
}

有任何想法吗?我尝试了各种不同的方法都无济于事。我只是得到一个没有导航栏的白屏(尽管顶部有一个状态栏)。

4

7 回答 7

7

模态并不总是获得有关旋转的信息,它们从状态栏获取信息,这并不总是正确的。把它放在你的 viewWillAppear 中来解决:[UIApplication sharedApplication].statusBarOrientation = self.interfaceOrientation而且,如果你想在你的模态里有一个导航控制器,你需要创建一个。

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

于 2010-09-22T17:49:34.070 回答
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];
于 2012-08-03T22:50:37.033 回答
2

以模态方式呈现导航控制器时遇到了同样的问题。确保正确实施:shouldAutorotateToInterfaceOrientation

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

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

于 2011-11-16T16:03:11.867 回答
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:”方法。然后它将起作用!

于 2010-11-04T15:42:57.287 回答
0

如果您像我这样仅将 presentModalViewController 用于动画,则可以将 pushViewController 与动画一起使用,如下所示;

显示 pushviewcontroller 动画看起来像 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];

希望能帮助到你..

于 2014-06-11T12:35:39.483 回答
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];
于 2015-08-04T21:47:49.463 回答
-1

您不需要新的导航控制器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];
}
于 2010-09-22T17:47:11.173 回答