Fügen Sie UIView über allen anderen Ansichten hinzu, einschließlich StatusBar

Ich möchte eine Sicht (UIControl) erstellen, die alle Eingaben blockiert und eine UIActivityIndicatorView beim Authentifizieren eines Benutzers anzeigt.

Sowohl UIActionSheet als auch UIAlertView schaffen es, eine schwarze, halbtransparente Ansicht über alle anderen Ansichten hinzuzufügen, um die Eingabe zu blockieren, und ich möchte dies ähnlich machen.

Ich habe versucht, meine Ansicht zum oberen UIWindow im Array [[UIApplication sharedApplication] windows] hinzuzufügen, und während dies über dem UIKeyboard platziert wird, wenn es sichtbar ist, wird es nicht über die Statusleiste platziert (was Sinn macht).

Mein nächster Versuch war, UIAlertView zu erweitern, alle seine Unteransichten zu entfernen und seine Schicht.contents = nil festzulegen, dann den ActivityIndicator als Unteransicht hinzuzufügen. Das funktioniert gut, aber ich kann nicht den Standardsprung der UIAlertView abbrechen, wenn Sie ihn “show” nennen.

Hat jemand irgendwelche Hinweise auf die beste Weise, dieses Problem anzugehen, das mir volle Kontrolle gibt?

Oh, und ich weiß, dass das Blockieren von Eingaben nicht großartig ist, aber ich stelle sicher, dass es für eine kurze Zeitperiode ist und es hat den Vorteil, dass es dem Benutzer klar macht, dass seine Aktion, die abgeschlossen werden muss, verarbeitet wird.

Ich habe etwas mehr um die APIs herum gegraben und glaube, dass ich es ausgearbeitet habe.

Um eine Ansicht über den gesamten Bildschirm anzuzeigen, müssen Sie ein eigenes UIWindow erstellen und seine windowLevel -Eigenschaft auf UIWindowLevelStatusBar setzen. Sie können dann Ihre benutzerdefinierten Unteransichten zu diesem Fenster hinzufügen.

Beachten Sie, dass Apple das Erstellen von mehreren Fenstern nicht unterstützt, aber auch nicht.

UIWindow *statusWindow = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; statusWindow.windowLevel = UIWindowLevelStatusBar; statusWindow.hidden = NO; statusWindow.backgroundColor = [UIColor colorWithWhite:0.0 alpha:0.7]; [statusWindow makeKeyAndVisible]; 

Wenn Sie das Fenster vom Bildschirm entfernen möchten, sieht es so aus, als würden Sie es aus dem Speicher freigeben.

 [statusWindow release]; 

Das fühlt sich nicht völlig sicher an, aber ich bekomme keine Fehler und scheint es aus dem Windows-Array der UIApplication zu entfernen. Bitte lassen Sie mich wissen, wenn das falsch ist.

Aktualisieren:

Ein anderes Problem, auf das ich stieß, war, dass die UIStatusBar Touch-Ereignisse nicht verwendete, um das aktive UIScrollView nach oben zu scrollen, nachdem ich dieses Overlay-Fenster angezeigt und entfernt hatte. Die Lösung bestand darin, das primäre Fenster wieder in das Schlüsselfenster zu bringen, sobald das Overlay freigegeben wurde.

 [primaryWindow makeKeyWindow]; 

Ich musste eine Übersicht über alle anderen Ansichten in meinem Hauptfenster präsentieren. Anfangs dachte ich daran, ein weiteres Fenster über meinem Schlüsselfenster zu präsentieren. Da Apple davon abrät, mehrere Fenster zu verwenden, entschied ich mich dagegen.

Der folgende Code hat den Trick für mich gemacht:

Ich habe meine Ansicht als eine Unteransicht zu meinem Schlüsselfenster hinzugefügt, die automatisch meine Ansicht über allen anderen Ansichten darstellt. In meinem Fall ist dieser Code im Delegate der App

 [self.window addSubview:topViewController.view] 

Und wenn ich mit der Ansicht fertig bin, entfernt der folgende Code sie aus dem Fenster.

 [topViewController.view removeFromSuperview]; 

Ich werde gleich das Gleiche machen und folgendes finden

http://www.dejal.com/developer/dasactivityview

Sieht so aus, als ob es alles hat, wonach du suchst