【问题标题】:iPhone - Typical problem with full screen and status bariPhone - 全屏和状态栏的典型问题
【发布时间】:2011-03-17 06:19:31
【问题描述】:

在我的应用程序中,默认状态栏是可见的。我的应用程序支持横向和纵向。 当我想播放视频时,我会隐藏状态栏,这样我的视频就会全屏显示。视频播放完毕后,我将状态栏带回来。

我正在使用以下代码来显示视频:

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;
}

当您使用上述代码运行应用程序时,它将以纵向启动。现在将其旋转为横向。你可以注意到这个问题。

【问题讨论】:

  • 也许您可以尝试在 viewDidLoad 和 didRotateFrominterfaceOrientation 方法中为您的视图设置框架...。试一试并检查位置...
  • 一点代码肯定会得到一些帮助
  • 嗨 7KV7,我添加了导致状态栏方向问题的示例代码。

标签: iphone orientation mpmovieplayercontroller statusbar


【解决方案1】:

我遇到了类似的问题,我通过 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 上声明它来稍微调整这个类别,并确保它调整的是 controller.view.frame 而不是 navigationBar.top,我想你会很高兴的。只需确保在电影播放完毕且已显示状态栏后调用视图控制器上的类别方法即可。

为了避免混淆,可能值得一提的是,您需要在横向模式下使用状态栏的宽度,因为 UIWindow 的坐标系总是就像是纵向一样工作,无论您如何握住设备。这与由 UIViewController 管理的子视图(UIView 实例)形成对比,后者受益于自动坐标转换。

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;
}

【讨论】:

  • 我不能使用导航控制器
  • 阅读帖子的其余部分 - 需要一些组装。
【解决方案2】:

显示时尝试更新状态栏样式:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-09
    • 2018-04-02
    • 1970-01-01
    • 1970-01-01
    • 2018-04-14
    • 1970-01-01
    • 2018-04-08
    相关资源
    最近更新 更多