2011-03-17 68 views
2

在我的应用程序默认状态栏是可见的。我的应用程序支持横向和纵向。 当我想播放视频时,我隐藏了状态栏,以便我的视频将全屏显示。当视频完成后,我将状态栏返回。iPhone - 全屏和状态栏的典型问题

我用下面的代码来显示视频:

UIWindow* window = [[UIApplication sharedApplication] keyWindow]; 
[window addSubview:playerView]; 

(我不能在我的代码使用视图控制器这是一个限制。)

现在的问题: 我的应用程序是在现在的风景中,点击一个按钮,我会隐藏状态栏并开始播放视频。当视频播放时,我将手机的方向改为肖像,并允许视频完成。视频完成后,设备仍处于肖像模式,播放器视图被删除,状态栏再次显示。现在我注意到我的肖像视图向上移动了20个像素,状态栏显示。但是当我第一次启动应用程序时,状态栏首先显示在下方,然后显示我的视图。

我应该如何处理这种情况?

简单地在视图控制器中使用下面的代码。

- (void)viewDidLoad { 
    [[UIApplication sharedApplication] setStatusBarHidden:YES]; 
    [self performSelector:@selector(showStatusAgain) withObject:nil afterDelay:6.0]; 
    [super viewDidLoad]; 
} 

-(void)showStatusAgain 
{ 
    [[UIApplication sharedApplication] setStatusBarHidden:NO]; 
} 


// Override to allow orientations other than the default portrait orientation. 
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
    return YES; 
} 

当你用上面的代码运行应用程序时,它将以纵向开始。现在将其旋转到风景。你可以注意到这个问题。

+0

可能是你可以尝试设置在viewDidLoad中您的视图的框架和也didRotateFrominterfaceOrientation方法....试试看它出来并检查位置... – 2011-03-17 06:28:57

+0

一点代码肯定会得到一些帮助 – visakh7 2011-03-17 06:29:32

+0

嗨7KV7,我添加了示例代码导致方向问题与状态栏。 – Satyam 2011-03-17 07:41:03

回答

6

我遇到了类似的问题,我用UINavigationController上的类别解决了这个问题。

的UINavigationController + LayoutCorrecting.h:

@interface UINavigationController (LayoutCorrecting) 

- (void)recalculateNavigationBarFrameRelativeToStatusBar; 

@end 

的UINavigationController + LayoutCorrecting.m:

#import "UINavigationBar+LayoutCorrecting.h" 

#import "UIViewAdditions.h" 

@implementation UINavigationController (LayoutCorrecting) 

- (void)recalculateNavigationBarFrameRelativeToStatusBar { 
    CGRect sbf = [[UIApplication sharedApplication] statusBarFrame]; 

    if (UIInterfaceOrientationIsLandscape(self.interfaceOrientation)) 
     self.navigationBar.top = sbf.size.width; 

    else 
     self.navigationBar.top = sbf.size.height; 
} 

@end 

如果你通过声明它的UIViewController,并确保它调整控制器调整这一类有点。 view.frame而不是navigationBar.top,我认为你会很开心。在电影完成播放后,确保在视图控制器上调用类别方法,并且您已经显示了状态栏。

而只是避开了任何混乱的原因,它可能是值得一提的,你需要使用状态栏的宽度在横向模式下,因为一个UIWindow的坐标系总是作品虽然它在肖像,任凭你怎么抱装置。这与由UIViewController管理的子视图(UIView实例)形成对比,UIViewController受益于自动坐标转换。

P.S .:由于您将不得不在窗口上下文中调整视图的框架,所以此功能也可能有所帮助。

CGRect CGRectOffsetRectForOrientation(CGRect rect, CGFloat dx, CGFloat dy, UIInterfaceOrientation orientation) { 
    CGRect newRect = rect; 

    switch (orientation) { 
     case UIInterfaceOrientationPortrait: 
      newRect.origin.x += dx; 
      newRect.origin.y += dy; 
      break; 

     case UIInterfaceOrientationPortraitUpsideDown: 
      newRect.origin.x -= dx; 
      newRect.origin.y -= dy; 
      break; 

     case UIInterfaceOrientationLandscapeLeft: 
      newRect.origin.y -= dx; 
      newRect.origin.x += dy; 
      break; 

     case UIInterfaceOrientationLandscapeRight: 
      newRect.origin.y += dx; 
      newRect.origin.x -= dy; 
      break; 

     default: 
      break; 
    } 

    return newRect; 
} 
+0

我无法使用导航控制器 – Satyam 2011-03-21 13:11:15

+0

阅读其余的帖子 - 需要一些程序集。 – 2011-03-21 20:16:54

0

尝试更新的状态栏样式,当你表现出来:

[[UIApplication sharedApplication] setStatusBarHidden:NO]; 
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefualt]; 
+0

这并没有解决问题。 – Satyam 2011-03-21 13:10:54