我有一个基于导航的应用程序,它有一个详细视图(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];
}
有什么想法吗?我尝试过各种不同的东西都无济于事。我只是得到一个没有导航栏的白色屏幕(尽管顶部有一个状态栏)。
答案 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];
}