gpt4 book ai didi

iPhone - 全屏和状态栏的典型问题

转载 作者:行者123 更新时间:2023-12-03 20:28:51 27 4
gpt4 key购买 nike

在我的应用程序中,默认状态栏是可见的。我的应用程序支持横向和纵向。当我想播放视频时,我隐藏状态栏,以便我的视频全屏显示。当视频完成时,我将恢复状态栏。

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

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

(我无法在代码中使用 View Controller 。这是一个限制)

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

遇到这种情况我该如何处理?

简单地在 View Controller 中使用以下代码。

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

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

最佳答案

我遇到了类似的问题,我通过 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,我想你会很高兴。只需确保在电影播放完毕并且已经显示状态栏后调用 View Controller 上的类别方法即可。

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

P.S.:由于您必须在窗口上下文中调整 View 的框架,因此此功能也可能有所帮助。

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

关于iPhone - 全屏和状态栏的典型问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5335586/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com