在iPhone上添加StatusBar视图

是否可以添加一个UIView大小(320×20)的钢筋? 我不想隐藏状态栏,我只想把它添加到状态栏的顶部。

您可以通过在现有状态栏上创build自己的窗口来轻松完成此操作。

只需用下面的initWithFrame:覆盖来创build一个UIWindow的简单子类initWithFrame:

 @interface ACStatusBarOverlayWindow : UIWindow { } @end @implementation ACStatusBarOverlayWindow - (id)initWithFrame:(CGRect)frame { if ((self = [super initWithFrame:frame])) { // Place the window on the correct level and position self.windowLevel = UIWindowLevelStatusBar+1.0f; self.frame = [[UIApplication sharedApplication] statusBarFrame]; // Create an image view with an image to make it look like a status bar. UIImageView *backgroundImageView = [[UIImageView alloc] initWithFrame:self.frame]; backgroundImageView.image = [UIImage imageNamed:@"statusBarBackground.png"]; [self addSubview:backgroundImageView]; [backgroundImageView release]; // TODO: Insert subviews (labels, imageViews, etc...) } return self; } @end 

现在,您可以在应用程序的视图控制器中创build新类的实例并使其可见。

 overlayWindow = [[ACStatusBarOverlayWindow alloc] initWithFrame:CGRectZero]; overlayWindow.hidden = NO; 

通过使用- (void)makeKeyAndVisible或类似的方法来了解与窗口键状态有关的内容。 如果您使主窗口(应用程序委托中的UIWindow )松开按键状态,则在点击状态栏等时,滚动滚动视图时会遇到问题。

我写了一个模拟Reeders状态栏覆盖的静态库,你可以在这里find它: https : //github.com/myell0w/MTStatusBarOverlay

MTStatusBarOverlayMTStatusBarOverlay

它目前支持iPhone和iPad,默认和不透明的黑色状态栏的风格,旋转,3种不同的信号模式,历史跟踪和更多的好东西!

随意使用它或向我发送拉取请求以加强它!

所有的答案看起来像工作,但在iOS6.0我有下一个问题:

1 /旋转看起来不好

2 / Window(状态栏是一种Window)需要rootViewController

我正在使用myell0w的答案,但旋转工作不好。 我只是删除一个额外的窗口,并使用AppDelegate的UIWindow来实现状态栏。 可能是这个解决scheme只适用于一个UIViewController应用程序…

我采用下一种方式实施:

1 /在ApplicationDelegate中:

 self.window.windowLevel = UIWindowLevelStatusBar + 1; self.window.backgroundColor = [UIColor clearColor]; self.window.rootViewController = _journalController; 

2 /创build自定义UIView并实现所有你需要的内容:例如可触摸的状态栏:

 @interface LoadingStatusBar : UIControl 

轻松创build并添加到您的控制器视图:

 _loadingBar = [[LoadingStatusBar alloc] initWithFrame:topFrame]; [self addSubview:_loadingBar]; 

3 /添加你的控制器视图时的一些魔法(在initWithFrame 🙂

  CGRect mainFrame = self.bounds; mainFrame.origin.y = 20; self.bounds = mainFrame; 

您的控制器视图将有2个视图 – 内容视图和状态栏视图。 您可以显示状态栏,或者在需要时隐藏它。 内容视图的框架将是:

 _contentView.frame = CGRectMake(0, 20, self.bounds.size.width, self.bounds.size.height); 

4 /在这里最后一个魔法:)为了检测非触摸区域中的触摸,我使用了:

 -(id)hitTest:(CGPoint)point withEvent:(UIEvent *)event { if (point.y < 20) return _loadingBar; return [super hitTest:point withEvent:event]; } 

目前,它在iPad / iPhone和所有iOS的从4到6工作正常。

只是为了解雇“你不能做这个评论”…

我不知道如何,但我知道这是可行的。 Feed阅读器应用程序称为Reeder做到这一点。

从屏幕截图中可以看到,Reeder在屏幕的右上angular放了一个小点。 当你点击它。 该栏将填充整个状态栏,直到再次点击它使其变小。

屏幕右上方的小图标替代文字

首先,非常感谢@MartinAlléus提供这个实现的代码。

我只是发布了一个我面临的问题和我使用的解决scheme,因为我相信其他人可能会遇到同样的问题。

如果应用程序在调用时启动,则状态栏高度将为40像素,这意味着自定义状态栏将以该高度初始化。 但是,如果在应用程序中仍然有呼叫结束,则状态栏高度将保持为40像素,看起来很奇怪。

所以解决scheme很简单:我已经使用通知中心来订阅应用程序的状态栏框架更改委托,并调整框架:

 - (void)application:(UIApplication *)application didChangeStatusBarFrame:(CGRect)oldStatusBarFrame { //an in call toggle was done //fire notification [[NSNotificationCenter defaultCenter] postNotificationName:kStatusBarChangedNotification object:[NSValue valueWithCGRect:oldStatusBarFrame]]; } 

在ACStatusBarOverlayWindow中,我们订阅通知:

 -(id)initWithFrame:(CGRect)frame { if ((self = [super initWithFrame:frame])) { // Place the window on the correct level & position self.windowLevel = UIWindowLevelStatusBar + 1.0f; self.frame = [UIApplication sharedApplication].statusBarFrame; self.backgroundColor = [UIColor blackColor]; //add notification observer for in call status bar toggling [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(statusBarChanged:) name:kStatusBarChangedNotification object:nil]; } return self; } 

和我们的代码来调整框架:

 - (void)statusBarChanged:(NSNotification*)notification { //adjust frame... self.frame = [UIApplication sharedApplication].statusBarFrame; //you should adjust also the other controls you added here } 

kStatusBarChangedNotification只是一个常数,我已经用于简单的引用,你可以简单地用一个stringreplace它,或者在全局中声明常量。