Iphone 模态视图控制器赢得';不要以横向模式启动

Iphone 模态视图控制器赢得';不要以横向模式启动,iphone,xcode,modalviewcontroller,Iphone,Xcode,Modalviewcontroller,我有一个基于导航的应用程序,它有一个细节视图(UIWebView),在UIToolbar的底部有一个操作按钮。我想在按下“备注”按钮时添加“备注”。当webview处于纵向模式时,一切正常。我按下notes按钮,模态视图打开得很好,效果很好 当webview处于横向模式时会出现问题。如果我按下notes按钮,所有打开模式视图的代码都会被调用,但我得到的只是一个白色屏幕。一条评论:如果我在纵向模式中打开模式视图,然后旋转设备,它会很好地旋转到横向模式。它在横向模式下无法正确打开 我有另一个按钮,用

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

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

我有另一个按钮,用于显示具有相同行为的邮件生成器。以下是my 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];
}
有什么想法吗?我试过各种各样的方法,但都没有用。我只是得到一个没有导航栏的白色屏幕(尽管顶部有一个状态栏)。

您不需要新的r


模态并不总是获取有关旋转的信息,它们从状态栏获取信息,而状态栏并不总是正常工作。将其放入您的视图将修复以下问题:
[UIApplication sharedApplication].StatusBaroOrientation=self.interfaceOrientation
,如果您希望在模式中安装导航控制器,则需要创建一个


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

哇,我在这个问题上浪费了好几天时间。。。但我找到了解决办法

我遇到了与您相同的问题:方法“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:”方法。那就行了

在演示导航控制器时遇到了同样的问题。确保正确执行:shouldAutorotateToInterfaceOrientation

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
{
    BOOL shouldAutorotate = NO;
    if( isControllerMangingAllOrientations )
    {
        shouldAutorotate = YES;
    }
    else
    {
        shouldAutorotate = (toInterfaceOrientation == UIInterfaceOrientationPortrait);
    }
    return shouldAutorotate;
}
我在viewDidLoad方法中设置布尔值,这不是一个好主意。将其放入initWithNibName:bundle:method是正确的位置。

答案如下:


如果您使用presentModalViewController仅用于像我这样的动画,您可以使用pushViewController和动画,如下答案

您可以按如下所示关闭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];

希望能有帮助。

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

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];

谢谢你这么快回复!我尝试将StatusBaroOrientation代码放入我的NotesViewController视图中,但我仍然会得到相同的行为!我还删除了新的导航控制器,仍然没有得到任何东西…只有白色屏幕。还有其他建议吗?你能为initWithPrimaryKey函数发布一些代码吗?在该文件上发布一些代码将非常有帮助!init函数很简单…xib文件只是一个UIView,下面有一个UIExtView。实际上,nib只是一个UIView,我通过编程创建了UIExtView。(我试过两种方法…)你试过记录你的子视图吗?添加一个NSLog in view,它将打印出子视图(self.view.subviews),以确保您的文本字段确实已创建。是吗?你在调试器中完成了吗?我删除了导航控制器,但仍然得到相同的行为。非常感谢您的回复。还有其他想法吗?你在使用最新的操作系统吗?我在3.1.3的肖像中推送仅横向模式视图时遇到问题…是的,我正在运行4.0 SDK…这对我也很有效。您没有使用BCTabBarController进行任何更改,是吗?对于那些动画小箭头来说太麻烦了…为了解决这个问题,忘记了默认情况下XCode 4添加了:
-(BOOL)应该自动旋转指向器面方向:(UIInterfaceOrientation)interfaceOrientation{return(interfaceOrientation==uiInterfaceOrientationGrait);}
难怪它总是纵向的。。。。叹息
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];
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];