Aggiunta di una vista su StatusBar in iPhone

È ansible aggiungere un UIView sulla barra di misura della dimensione (320 x 20)? Non voglio hide la barra di stato, voglio solo aggiungerla in cima alla barra di stato.

Puoi farlo facilmente creando la tua finestra sopra la barra di stato esistente.

Basta creare una semplice sottoclass di UIWindow con il seguente override di 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 

È ora ansible, ad esempio in un controller di visualizzazione nell’applicazione, creare un’istanza della nuova class e renderla visibile.

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

Essere consapevoli di fare scherzi con lo stato della chiave della finestra usando - (void)makeKeyAndVisible o simile. Se si UIWindow la finestra principale ( UIWindow nel delegato dell’applicazione), lo stato della chiave intriggers, si verificheranno problemi con lo scorrimento delle immagini a scorrimento in alto quando si tocca la barra di stato, ecc.

Ho scritto una libreria statica che imita la sovrapposizione della barra di stato di Reeders, puoi trovarla qui: https://github.com/myell0w/MTStatusBarOverlay

MTStatusBarOverlayMTStatusBarOverlay

Attualmente supporta iPhone e iPad, stili di barra di stato nero opaco e predefinito, rotazione, 3 diverse modalità di cattura, tracciamento della cronologia e molte altre chicche!

Sentiti libero di usarlo o mandami una richiesta di pull per migliorarla!

Tutte le risposte sembrano funzionare, ma in iOS6.0 ho i seguenti problemi:

1 / Le rotazioni sembrano pessime

2 / Finestra (la barra di stato è una specie di finestra) necessario rootViewController

Sto usando la risposta di myell0w , ma ruotare funziona male. Ho appena rimosso una finestra aggiuntiva e utilizzando UIWindow da AppDelegate per implementare la barra di stato. Potrebbe essere questa soluzione è ok solo per una UIViewController-app …

Ive implementato dal modo seguente:

1 / In ApplicationDelegate:

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

2 / Crea un UIView personalizzato e implementa tutto ciò di cui hai bisogno all’interno: Per un esempio di barra di stato tangibile:

 @interface LoadingStatusBar : UIControl 

E facilmente creare e aggiungere alla tua vista controller:

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

3 / Un po ‘di magia quando aggiungi la vista del tuo controller (in initWithFrame 🙂

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

La vista del controller avrà 2 viste: vista del contenuto e vista della barra di stato. Puoi mostrare la barra di stato o nasconderla quando vuoi. La cornice della visualizzazione del contenuto sarà:

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

4 / E un’ultima magia qui 🙂 Per rilevare i tocchi nell’area non tangibile ho usato:

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

Per ora funziona bene su iPad / iPhone e tutti gli iOS da 4 a 6.

Giusto per respingere il “Non puoi fare questo commenti” …

Non so come, ma so che è fattibile. L’app di feed reader chiamata Reeder lo fa.

Come puoi vedere dallo screenshot, Reeder mette un piccolo punto in alto a destra sullo schermo. Quando lo tocchi La barra riempirà l’intera barra di stato fino a quando non la tocchi di nuovo per renderla piccola.

Una piccola icona in alto a destra dello schermoalt text

Prima di tutto, un grande ringraziamento a @Martin Alléus per aver fornito il codice per questa implementazione.

Sto solo postando un problema che ho affrontato e la soluzione che ho usato, poiché credo che altri potrebbero riscontrare lo stesso problema.

Se l’app viene avviata mentre è in corso una chiamata, l’altezza della barra di stato sarà di 40 pixel e ciò significa che la barra di stato personalizzata verrà inizializzata con tale altezza. Ma se la chiamata termina mentre sei ancora nell’app, l’altezza della barra di stato rimarrà ancora 40 pixel e sembrerà strana.

Quindi la soluzione è semplice: ho utilizzato il Centro notifiche per iscriversi al delegato di modifica frame della barra di stato dell’app e regolare il frame:

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

E in ACStatusBarOverlayWindow ci iscriviamo alla notifica:

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

e il nostro codice per regolare la cornice:

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

La kStatusBarChangedNotification è solo una costante che ho usato per un facile riferimento, puoi semplicemente sostituirla con una stringa o dichiarare la costante a livello globale.