Compilare ciò che Dima ha risposto, ho pensato che un'implementazione di base per far iniziare le persone potesse essere d'aiuto. Come ha detto Dima, non sta spostando la barra di stato, ma spostando un'immagine della barra di stato.
Diniego: Ho YOLO'd questa implementazione così faccio garanzie su se funzionerà fuori dalla scatola
Partendo iOS7 è possibile scattare una fotografia con
UIView *screen = [[UIScreen mainScreen] snapshotViewAfterScreenUpdates:NO];
Così in pratica la barra di stato viene ritagliata dall'immagine e aggiunta a UIWindow
con uno sopra UIWindowStatusLevelBar
in modo da poterlo vedere sulla barra di stato reale. Qualcosa di simile:
UIWindow *statusBarWindow = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
statusBarWindow.windowLevel = UIWindowLevelStatusBar + 1; // higher
statusBarWindow.hidden = NO; // fun fact you don't have to add a UIWindow to anything, just setting hidden = NO should display it
statusBarWindow.backgroundColor = [UIColor clearColor]; // since visible, make it clear until we actually add the screen shot to it so as to not block anything
...
// The view that will hold the screen shot
// Later, I think we're going to need to play with contentInsets to make the view look like its staying still, so we're making it a UIScrollView in case
UIScrollView *statusBarView = [[UIScrollView alloc] initWithFrame:[UIApplication sharedApplication].statusBarFrame];
statusBarView.clipsToBounds = YES;
// Now we add the screen shot we took to this status bar view
[scrollingStatusBarView addSubview:statusBarView];
[statusBarView addSubview:screen]; // screen is the UIScrollView from previous code block (the screen shot)
// Now add this statusBarView with the image to the window we created
[statusBarWindow addSubview:statusBarView];
Ora il resto in realtà dipende da ciò che la vostra applicazione sta cercando come, ma da qui si ha realmente solo bisogno di gestire lo spostamento della vista o con una padella, o qualsiasi azione sta causando la nuova vista di entrare attraverso il lato.
Quando strisciata inizia, configurare la nuova barra di stato (quello sotto) con qualsiasi stile, fondo, qualsiasi cosa:
[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent animated:NO];
// anything else you might feel like doing
Ora abbiamo qualcosa di interessante sta succedendo qui. Man mano che la transizione si sposta, dovrai utilizzare l'importo scorretto per "ritagliare" quell'offset dall'offset dello statusBarView
. Lo statusBarView.frame
dovrà iniziare con x = offset oppure verrà mostrato sulla barra di stato attuale (poiché la finestra è più in alto), ma se non si modifica il contentInsets, l'immagine scorrerà con la transizione. Quindi, per creare l'illusione, dovrai spingere l'origine verso destra mentre aumenti il contenuto sinistro della stessa quantità in modo che sembri trovarsi nella stessa posizione.
Così dentro qualsiasi metodo sta gestendo l'azione di scorrimento:
Nota: Questo sarà fortemente dipenderà realizzazione personale e probabilmente prendere qualche sperimentazione
// if you're using an animation to handle the transition you can match up this change in x position with the animation
// if you're doing via pan gesture you could try something like:
CGFloat offset = self.viewThatIsScrolling.contentOffset.x; // may be negative depending on direction that is being swiped
if (midTransition) { // you can use the offset value here to check
// NOTE: again, will depend on which direction this animation is happening in. I'll assume a new view coming in from left (so swiping right)
statusBarView.frame = CGRectMake(offset, 0, self.statusBarView.frame.width, 20.0f); // move the origin over to the right
statusBarView.contentInsets = UIEdgeInsetsMake(0, offset, 0, 0); // make the picture start 'offset' pixels to the left so it'll look like it hasn't moved
}
(Nota a margine: è anche possibile prova ad usare una trasformazione invece di impostare esplicitamente il frame: statusBarView.transform = CGAffineTransformMakeTranslation(offset -previousOffsetAmount, 0);
. Io uso il previousOffsetAmount lì perché vuoi che si muova da qualsiasi nuova quantità in modo che possa corrispondere.Questo dovrà essere rintracciato in qualche modo se vai questo percorso)
E infine una volta che il 'scorrimento' è fatto, non dimenticate di rimuovere la schermata dalla finestra completamente:
// if continuing from before:
if (midTransition) {
...
} else { // the view has been slid completely
[statusBarView removeFromSuperview];
statusBarView = nil;
// I'm keeping the UIWindow where it is for now so it doesn't have to be recreated and because it has a clear background anyways
}
// if this is being done via animation the above can be called the animation finishes
potrei davvero essere interessato a cercare di ottenere questo al lavoro, così aggiornerà se così.
Forse stanno ripetutamente schermando la barra di stato e modificando ripetutamente i cappucci durante la transizione. O forse stanno rilevando i cambiamenti di batteria/tempo/segnale, quindi la limitazione dello schermo solo quando queste cose cambiano. –
Chiaramente c'è una magia profonda a piedi. – CrimsonChris