我有下一个视图控制器:
FirstViewController
SecondViewController
ThirdViewController
目标是:通过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帧=(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模拟器上做了所有测试。
我已将此代码添加到我的基本视图控制器,但它仍然不适用于我。
- (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;
答案 0 :(得分:1)
亚历山大,请你试试下面的代码吧。它工作在4.3(添加到SecondViewController):
- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
[super willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration];
[UIApplication sharedApplication].statusBarHidden = YES;
}
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
AMThirdViewController* th = [[AMThirdViewController alloc] initWithNibName:nil bundle:nil];
[self presentModalViewController:th animated:NO];
[UIApplication sharedApplication].statusBarHidden = NO;
}
答案 1 :(得分:0)
您的 SecondViewController 框架是(0,20; 300,480)而不是(0,0; 320,480),因为屏幕顶部有状态栏。因此,您可以通过设置值“none”从“属性检查器”中删除状态栏,也可以在
中自定义视图框-(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
if (UIInterfaceOrientationIsLandscape(orientation)) {
//Landscape orientation code
}else {
//portrait orientation code
}
}
方法