如何在iOS中隐藏状态栏图标

我想创build一个简单的mobilesubstrate调整隐藏和显示状态栏图标,如电池或载波或无线信号indecator。 我见过libstatusbar项目,但我不知道如何隐藏iOS的图标。 有没有其他的方式来做到这一点,而不使用这个库? 我只想隐藏并显示默认的图标

以下是我在调整中使用的内容:

int itemToHide = 0; [[objc_getClass("SBStatusBarStateAggregator") sharedInstance] beginCoalescentBlock]; [[objc_getClass("SBStatusBarStateAggregator") sharedInstance] _setItem:itemToHide enabled:NO]; [[objc_getClass("SBStatusBarStateAggregator") sharedInstance] endCoalescentBlock]; 

唯一的问题 – iOS使用状态栏项目的整数值,他们在不同的iOS版本上是不同的。 你可以testing每个iOS版本,并为每个版本存储值,但是我find了一个更好的方法。

我挂钩了SBStatusBarStateAggregator _setItem:(int)arg1 enabled:(BOOL)arg2方法。 然后我调用SBStatusBarStateAggregator -(void)_update****方法之一。 例如,我们假设要查找位置图标索引。 我调用SBStatusBarStateAggregator -(void)_updateLocationItem方法。 然后它会调用挂钩的SBStatusBarStateAggregator _setItem:(int)arg1 enabled:(BOOL)arg2我将存储索引。

我也挂钩SBStatusBarStateAggregator -(void)_notifyItemChanged:(int)arg 。 这个方法被称为SBStatusBarStateAggregator -(void)_update****一部分SBStatusBarStateAggregator -(void)_update****调用。 当确定状态栏图标索引时,我简单地忽略对它的调用,而不用调用原始实现。

如果你想永久隐藏一些图标,你仍然需要钩住SBStatusBarStateAggregator _setItem:(int)arg1 enabled:(BOOL)arg2 and SBStatusBarStateAggregator -(void)_notifyItemChanged:(int)arg为了忽略任何iOS尝试显示隐藏的图标。 例如,每次更新信号电平和数据/时间都可重新使用。

这就是iOS 7的全部。在iOS 5-6上,API是不同的,但我使用的方法基本相同。 隐藏状态栏项目

 int itemToHide = 0; [[objc_getClass("SBStatusBarDataManager") sharedDataManager] setStatusBarItem:itemToHide enabled:NO]; 

我钩SBStatusBarDataManager -(void)updateStatusBarItem:(int)item来确定图标的索引,然后调用SBStatusBarDataManager -(void)_locationStatusChange的情况下的位置图标。

不可以使用公共API。 你只能隐藏整个状态栏,不仅仅是它的某些元素。

越狱,看看:

https://github.com/nst/iOS-Runtime-Headers/blob/master/Frameworks/UIKit.framework/UIStatusBarItem.h

特别要看下面的方法:

 + (BOOL)itemType:(int)arg1 idiom:(int)arg2 appearsInRegion:(int)arg3; + (BOOL)itemType:(int)arg1 idiom:(int)arg2 canBeEnabledForData:(id)arg3 style:(id)arg4; 

参考这些方法是否应该出现iterms。 在这里返回NO来禁用项目。

好。 这是解决scheme。
在你的plist文件中添加行:

 查看基于控制器的状态栏外观:NO 

使用以下内容在UINavigationBar上创build一个类别:

 #import“UINavigationBar + StatusBar.h”
 #import 

 @implementation UINavigationBar(StatusBar)

 +(无效)负载
 {
     [self swizzleOriginalSelectorWithName:@“layoutSubviews”toSelectorWithName:@“my_layoutSubviews”];
 }

 - (void)my_layoutSubviews
 {
     [self my_layoutSubviews];
     [self setFrame:CGRectMake(0,0,self.frame.size.width,64)];
 }

 +(void)swizzleOriginalSelectorWithName:(NSString *)origName toSelectorWithName:(NSString *)swizzleName
 {
    方法origMethod = class_getInstanceMethod([self class],NSSelectorFromString(origName));
    方法newMethod = class_getInstanceMethod([self class],NSSelectorFromString(swizzleName));
     method_exchangeImplementations(origMethod,newMethod);
 }

 @结束

这会增加导航栏20pt。

然后,进行状态栏的自定义视图。 例如

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
 {
     [self makeCustomSatusBar];
     //覆盖应用程序启动后的自定义点。
    返回YES;
 }

 - (void)makeCustomSatusBar
 {
     [[UIApplication sharedApplication] setStatusBarHidden:YES];

     UIColor * statusBarColor = [UIColor blackColor];

     UIView * view = [[UIView alloc] initWithFrame:CGRectMake(0,0,self.window.frame.size.width,20)];
     view.layer.zPosition = INT_MAX;
     view.backgroundColor = [UIColor clearColor];

     //制作时间标签
     NSDateFormatter * formatter = [NSDateFormatter new];
     formatter.dateFormat = @“HH:mm”;
     UILabel * timeLabel = [UILabel new];
     timeLabel.text = [formatter stringFromDate:[NSDate date]];
     timeLabel.textColor = statusBarColor;
     timeLabel.font = [UIFont systemFontOfSize:12];
     [timeLabel sizeToFit];
     timeLabel.center = CGPointMake(view.frame.size.width / 2,view.frame.size.height / 2);
     [查看addSubview:timeLabel];
     //

     //制作其他需要的指标
     // ...

     [self.window addSubview:view];
 }

你会有这样的东西:

在这里输入图像说明

请注意,您需要每次更新自定义视图的值(例如时间标签,电池等),因此最好为状态栏创build一个单独的类,并使用1秒的时间创build一个无限定时器打勾,并在计时器的行动做你的更新。

可能你只是需要这个?

  [[UIApplication sharedApplication] setStatusBarHidden:YES] 

如果你只想在20pt高度的空视图,然后将其添加到UIWindow,并将UIWindow的子视图向下移动20点