2009-02-27 5 views
23

Ich möchte eine Fortschrittsanzeige in einer halbtransparenten Box anzeigen, die über einer Tabellenansicht schwebt. Mit anderen Worten, wenn der Tabelleninhalt heruntergeladen wird, möchte ich ein "Update" -Label darüber erscheinen.Wie wird ein Fortschrittsanzeige-Overlay/HUD auf dem iPhone angezeigt?

Ich habe das in mehreren Apps im Laden gesehen, vor allem Facebook (wenn Sie schütteln, um neu zu laden) und Darkslide.

Mein erster Impuls besteht darin, eine halbtransparente UIView zu erstellen, eine UILabel und eine UIProgressIndicatorView darin zu platzieren und sie der Ansichtshierarchie hinzuzufügen ... aber wo? Ein UIView darf seine Geschwister nicht überlappen, so dass ich es nicht zu einer Unteransicht des Fensters machen kann. Ich kann es auch nicht zu einer Unteransicht der Tabelle machen, weil es dann mit dem Tabelleninhalt nach oben und unten scrollt.

Ich dachte über die Erstellung eines neuen UIWindow, aber die Dokumentation sagt grundsätzlich nicht.

Ich weiß, CALayers können einander überlappen, so dass wäre eine Option, aber ich kann nicht eine Fortschrittsanzeige in einem CALayer setzen, kann ich? Sollte ich meine eigene Fortschrittsanzeige drehen, die eine CALayer anstelle einer UIView animiert?

Ich bin nicht interessiert zu hören über private APIs.

Bearbeiten: Die Frage basierte auf einer fehlerhaften Annahme. NSViews (auf Mac OS X) dürfen sich nicht überlappen, aber UIViews auf dem iPhone können.

+0

Sie können selbst sparen f einige arbeiten mit dem [MBProgressHUD] (https://github.com/matej/MBProgressHUD), wenn es Ihren Bedürfnissen entspricht. –

Antwort

14

Sie können Ansichten auf jeden Fall überschneiden. Fügen Sie einfach das transparente Overlay als Unteransicht in der TabelleView hinzu.

Von UIView Dokumentation:

UIView Objekte innerhalb eines UIWindow Objekt angeordnet sind, in einer verschachtelten Hierarchie von Subviews. Übergeordnete Objekte in der Ansichtshierarchie werden als Superviews bezeichnet, und untergeordnete Objekte werden als Unterviews bezeichnet. Ein Ansichtsobjekt beansprucht eine rechteckige Region seiner umgebenden Superansicht, ist für das Zeichnen innerhalb dieser Region verantwortlich und ist berechtigt, auch darin auftretende Ereignisse zu empfangen. Geschwisteransichten können sich ohne Probleme überlappen, wodurch eine komplexe Ansicht möglich ist.

+0

Interface Builder hat mich in die Irre geführt! Ich weiß, dass NSViews sich nicht überlappen können, und wenn Sie überlappende UIViews in IB erstellen, wird es sie mit Warnungen kennzeichnen. Danke, dass du mich richtig gestellt hast. – benzado

1

Jedes Objekt, das sich in Ihrer MainWindow.xib befindet, kann über eine Steckdose auf das Anwendungsfenster zugreifen. Der Anwendungsdelegat in den Standardprojekten hat es bereits, aber Sie möchten wahrscheinlich die Steckdose zu Ihrem View-Controller hinzufügen, der das Fortschritts-Overlay anzeigen muss.

Da in UIKit die UIWindow ist ein UIView (im Gegensatz zu NSWindow vs. NSView in Cocoa), können Sie einfach Ihre Fortschritte Ansicht als Subview des Fensters hinzu:

[window addSubview:progressView];

progressView wird die gesamte Abdeckung Anwendungsoberfläche.

diesem Beispiel wird die Technik auf das Splash-Bild Default.png Ausblenden:

http://michael.burford.net/2008/11/fading-defaultpng-when-iphone-app.html


Mit Bezug auf den letzten zu bearbeiten, wie von MacOS X 10.5 Leopard NSView-Überlappung ist deterministisch (sie könnten sich immer überlappen, Sie haben nur unbestimmte Ergebnisse), obwohl es eine andere Reihenfolge von vorne nach hinten hat, abhängig davon, ob die enthaltene Ansicht Layer-Backed ist oder nicht. Dies ist wahrscheinlich ein Nebeneffekt der Integration von CALayers in das OS X View System.

-1

Antwort: Äpfel Docs sind ziemlich genial. http://developer.apple.com/iphone/library/featuredarticles/ViewControllerPGforiPhoneOS/Introduction/Introduction.html

Momentan bin ich in Überlagerung transparente Ansichten (zumindest auf der Rückseite einer Serviette an dieser Stelle). Sie können sie verwenden, um Menütasten zu halten, sie in 3D-Raum zu verschieben, nur Nüsse zu bekommen.

ich meine, ist dies ein religiöser Darm-Trakt oder was? Tolle Sachen von den Jungs von NEXT:

UIView-Objekte sind innerhalb eines UIWindow-Objekts in einer geschachtelten Hierarchie von Subviews angeordnet. Übergeordnete Objekte in der Ansichtshierarchie werden als Superviews bezeichnet, und untergeordnete Objekte werden als Unterviews bezeichnet. Ein Ansichtsobjekt beansprucht eine rechteckige Region seiner umgebenden Superansicht, ist für das Zeichnen innerhalb dieser Region verantwortlich und ist berechtigt, auch darin auftretende Ereignisse zu empfangen. Geschwisteransichten können sich ohne Probleme überlappen, wodurch eine komplexe Ansicht möglich ist.

15

Ich habe gerade gebucht ein HUD Version von mir: https://github.com/y0n3l/LGViewHUD

Sie sehr leicht, dieses Ergebnis zu erreichen:

#import "LGViewHUD.h" 
.... 
LGViewHUD* hud = [LGViewHUD defaultHUD]; 
hud.activityIndicatorOn=YES; 
[email protected]"The longer...."; 
[email protected]"The better !"; 
[hud showInView:self.view]; 

enter image description here

Sobald die Aufgabe beendet ist, nur aufrufen

[[LGViewHUD defaultHUD] hideWithAnimation:HUDAnimationHideFadeOut]; 

und das war's!

+0

Vielen Dank für diese Open-Source-Lösung – shkschneider

+0

Vielen Dank für das Teilen, das ist super! – kernix

9

Auch gibt es die ziemlich berühmt MBProgressHUD & SVProgressHUD
Sie sind die gleiche Art wie @yonel ‚s HUD

Beispiel

[SVProgressHUD show]; 
[SVProgressHUD dismiss]; 

SVProgressHUD Examples MBProgressHUD scheint jetzt beliebter (wenn wir Basis auf Github Sterne)

+1

SVProgress hat sehr gut für mich gearbeitet. Es scheint einfach und doch flexibel. Beachten Sie, verwenden Sie "Kopf" -Version für iOS 7-Kompatibilität. – Nick

+0

Ist es möglich, ein Bild anstelle des Spinner in SVProgressHUD ?? – Ramakrishna