我正在尝试做一件非常简单的事情:在我的应用程序中仅支持水平方向,除了1堆视图控制器。为简单起见,假设我有两个UIViewControllers。让我们称它们为maskLandscapeVC和maskAllVC。每个都单独嵌入自己的自定义UINavigationController实例中。这是导航控制器的代码。
#import "MPTLoginNav.h"
@interface MPTLoginNav ()
@end
@implementation MPTLoginNav
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
}
return self;
}
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view.
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
#pragma mark
#pragma Interface Orientaiton Methods
- (NSUInteger)supportedInterfaceOrientations
{
if (self.isMaskAllStack)
return UIInterfaceOrientationMaskAll;
return UIInterfaceOrientationMaskLandscape;
}
- (BOOL)shouldAutorotate
{
return YES;
}
@end
在maskLandscapeVC上,此代码工作正常,只能使用两个水平方向。 用户可以从maskLandscapeVC导航到maskAllVC。以下代码负责
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Storyboard" bundle:[NSBundle bundleForClass:[self class]]];
self.maskAllVC = [storyboard instantiateViewControllerWithIdentifier:@"maskAllVC"];
[self.navigationController pushViewController:self.maskAllVC animated:YES];
在maskAllVC,代码也很好用,并支持所有四个方向。
一旦进入maskAllVC,用户就会切换到VERTICAL方向。 maskLandscapeVC是maskAllVC的委托。在maskAllVC的垂直方向上,用户按下某个按钮。该按钮调用委托(maskLandscapeVC),根据某些条件,maskLandscapeVC决定解除maskAllVC。它使用以下代码
[self.maskAllVC.navigationController popViewControllerAnimated:YES];
[self.maskAllVC.navigationController dismissViewControllerAnimated:YES completion:nil];
现在回到maskLandscapeVC,方向仍然是垂直的,当然我的视图因为它完全搞砸了。
答案 0 :(得分:0)
我认为因为你把它弹回来它并没有像第一次那样刷新整个ViewController。使用viewDidLoad而不是viewWillAppear可能是问题所在。 viewDidLoad只被调用一次。
如果设置断点,是否进行完整的layoutSubview刷新?当你弹出时,它是否会调用supportedInterfaceOrientations?如果将viewDidLoad代码移动到viewWillAppear会发生什么?