如何在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点