我有下一个视图控制器:
第一视图控制器
第二视图控制器
第三视图控制器
目标是:通过 SecondViewController 呈现 ThirdViewController。
在 FirstViewController 中,我使用以下方法展示 SecondViewController:
[self presentModalViewController:secondViewController animated:NO];
加载 SecondViewController 时,我在-viewDidAppear:
委托回调方法中显示 ThirdViewController:
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
[self presentModalViewController:thirdViewController animated:NO];
}
所以,我认为当前视图控制器的方案已经为我们所有人所熟知。也许代码的设计不好,但我已经做了这个解决方案,并且有下面描述的问题。
加载 ThirdViewController 时,我遇到了 20 分的问题(但仅适用于 iOS 4.3,其他版本运行良好)。
我附上了显示我的问题的文件。
正如您在左侧看到的,我有不需要的偏移量。旋转屏幕后此问题消失。
当我打印 ThirdViewController 视图框架时,它显示我 frame = (0 0; 480 300)。可能是 SecondViewControllers 视图中的问题。
关于旋转。我在每个控制器中实现了以下这些方法:
- (BOOL)shouldAutorotate
{
return YES;
}
- (NSUInteger)supportedInterfaceOrientations
{
return UIInterfaceOrientationMaskLandscape;
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
if (interfaceOrientation==UIInterfaceOrientationLandscapeLeft || interfaceOrientation==UIInterfaceOrientationLandscapeRight)
return YES;
return NO;
}
(更新:)是的,我现在发现了问题,SecondViewController frame = (0 20; 300 480); 但我不明白为什么。
我添加了这个方法来检查当前方向:
-(void) getCurrentOrientation{
UIInterfaceOrientation orientation = [[UIDevice currentDevice] orientation];
if(orientation == UIInterfaceOrientationPortrait){
NSLog(@"portrait");
} else if(orientation == UIInterfaceOrientationLandscapeRight) {
NSLog(@"LandscapeRight");
} else if(orientation == UIInterfaceOrientationLandscapeLeft) {
NSLog(@"LandscapeLeft");
}
}
并在方法中检查它,-viewDidAppear:
它显示当前方向是纵向而不是我在shouldAutorotateToInterfaceOrientation
回调中设置的横向模式。
此外,我发现 iPad iOS 4.3 效果很好。
我在 iPhone Simulator 上做了所有测试。
我已将此代码添加到我的基本视图控制器中,但它仍然对我不起作用。
- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
if (UIInterfaceOrientationIsLandscape(self.interfaceOrientation)) {
//Landscape orientation code
if (IS_IPAD) {
[self.view setFrame:CGRectMake(0, 0, 1024, 748)];
}
else if (IS_IPHONE) {
[self.view setFrame:CGRectMake(0, 0, 480, 300)];
}
else if (IS_IPHONE_5) {
[self.view setFrame:CGRectMake(0, 0, 568, 300)];
}
NSLog(@"landscape");
NSLog(@"%@", [NSValue valueWithCGRect:self.view.frame]);
}else {
//portrait orientation code
NSLog(@"portrait");
}
}
(工作更新:)
我使用下面的代码解决了这个问题:
[UIApplication sharedApplication].statusBarHidden = YES;
if (self.thirdViewController) self.thirdViewController = nil;
self.thirdViewController = [[ThirdViewController alloc] initWithNibName:@"ThirdViewController"] bundle:nil];
[self presentModalViewController:self.self.thirdViewController animated:NO];
[UIApplication sharedApplication].statusBarHidden = NO;