バッテリーやキャリア、wifi 信号インジケーターなどのステータス バー アイコンを非表示および表示する単純なモバイル基板の微調整を作成したいと考えています。libstatusbarプロジェクトを見てきましたが、iOS のアイコンを非表示にする方法がわかりません。このライブラリを使用せずにこれを行う他の方法はありますか? デフォルトのアイコンを非表示にして表示したいだけです
4 に答える
パブリック 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;
これらのメソッドは、項目が表示されるかどうかに関係なく参照されます。ここに戻っNOてアイテムを無効にします。
微調整で使用するものは次のとおりです。
int itemToHide = 0;
[[objc_getClass("SBStatusBarStateAggregator") sharedInstance] beginCoalescentBlock];
[[objc_getClass("SBStatusBarStateAggregator") sharedInstance] _setItem:itemToHide enabled:NO];
[[objc_getClass("SBStatusBarStateAggregator") sharedInstance] endCoalescentBlock];
唯一の問題 - iOS はステータス バー項目に整数値を使用し、iOS バージョンごとに異なります。iOS のすべてのバージョンをテストして、それぞれの値を保存することもできますが、より良い方法を見つけました。
アイフックSBStatusBarStateAggregator _setItem:(int)arg1 enabled:(BOOL)arg2方式。次に、メソッドの 1 つを呼び出しSBStatusBarStateAggregator -(void)_update****ます。たとえば、場所のアイコンのインデックスを見つけたいとしましょう。メソッドを呼び出しますSBStatusBarStateAggregator -(void)_updateLocationItem。SBStatusBarStateAggregator _setItem:(int)arg1 enabled:(BOOL)arg2次に、インデックスを格納する場所にhooked を呼び出します。
私も引っ掛けSBStatusBarStateAggregator -(void)_notifyItemChanged:(int)argます。このメソッドは、SBStatusBarStateAggregator -(void)_update****call の一部として呼び出されます。ステータスバーのアイコンインデックスを決定するとき、元の実装を呼び出さずに戻ることで、それへの呼び出しを単に無視します。
また、一部のアイコンを永久に非表示にしたい場合でも、フックする必要があり、非表示のアイコンを表示しようSBStatusBarStateAggregator _setItem:(int)arg1 enabled:(BOOL)arg2と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
Ok。これが解決策です。
plist ファイルに次の行を追加します。
コントローラー ベースのステータス バーの外観を表示する: いいえ
このコンテンツで UINavigationBar にカテゴリを作成します。
#import "UINavigationBar+StatusBar.h"
#輸入
@implementation UINavigationBar (ステータスバー)
+ (ボイド)荷重
{
[self swizzleOriginalSelectorWithName:@"layoutSubviews" toSelectorWithName:@"my_layoutSubviews"];
}
- (void)my_layoutSubviews
{
[自己 my_layoutSubviews];
[self setFrame:CGRectMake(0, 0, self.frame.size.width, 64)];
}
+ (void)swizzleOriginalSelectorWithName:(NSString *)origName toSelectorWithName:(NSString *)swizzleName
{
メソッド origMethod = class_getInstanceMethod([self クラス], NSSelectorFromString(origName));
メソッド newMethod = class_getInstanceMethod([self クラス], NSSelectorFromString(swizzleName));
method_exchangeImplementations(origMethod, newMethod);
}
@終わり
これにより、ナビゲーション バーが 20pt 増加します。
次に、ステータス バーのカスタム ビューを作成します。例えば
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
[self makeCustomSatusBar];
// アプリケーション起動後のカスタマイズのポイントをオーバーライドします。
はいを返します。
}
- (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 日付]];
timeLabel.textColor = statusBarColor;
timeLabel.font = [UIFont systemFontOfSize:12];
[timeLabel sizeToFit];
timeLabel.center = CGPointMake(view.frame.size.width/2, view.frame.size.height/2);
[view addSubview:timeLabel];
///
// 必要な他のインジケーターを作成します...
//...
[self.window addSubview:view];
}
そして、あなたは次のようになります:

毎回カスタムビューの値を更新する必要があることに注意してください(つまり、時間ラベル、バッテリーなど)。そのため、ステータスバー用に別のクラスを作成し、1秒の無限タイマーを作成することをお勧めしますタイマーのアクションで更新をチェックして実行します。
これが必要なだけですか?
[[UIApplication sharedApplication] setStatusBarHidden:YES]
そして、20ptの高さの上に空のビューだけが必要な場合は、それを作成してUIWindowに追加し、UIWindowのサブビューを20pt下にシフトします