2009-02-27 14 views
23

Desidero visualizzare un indicatore di avanzamento in una casella semitrasparente che scorre su una vista tabella. In altre parole, quando si scaricano i contenuti della tabella, voglio che appaia su di essa un'etichetta "Aggiornamento".Come visualizzare un indicatore di avanzamento overlay/HUD su iPhone?

Ho visto questo in diverse app nel negozio, in particolare Facebook (quando scuoti per ricaricare) e Darkslide.

Il mio primo impulso è quello di creare un UIView semi-trasparente, inserire un UILabel e un UIProgressIndicatorView al suo interno e aggiungerlo alla gerarchia della vista ... ma dove? Un UIView non può sovrapporsi ai suoi fratelli, quindi non posso renderlo una sottoview della finestra. Anche io non posso renderlo una sottoview della tabella, perché poi scorrerà su e giù con il contenuto della tabella.

Ho pensato di creare una nuova UIWindow, ma la documentazione dice semplicemente non.

So che i CALAY possono sovrapporsi l'un l'altro, quindi questa sarebbe un'opzione, ma non posso inserire un indicatore di avanzamento all'interno di un CALayer, posso? Dovrei lanciare il mio indicatore di avanzamento che anima un CALayer invece di un UIView?

Non mi interessa sapere di private APIs.

Modifica: La domanda era basata su un'assunzione errata. NSViews (su Mac OS X) potrebbe non sovrapporsi, ma UIViews su iPhone potrebbe.

+0

Puoi salvare yoursel Per alcuni lavori utilizza [MBProgressHUD] (https://github.com/matej/MBProgressHUD) se soddisfa le tue esigenze. –

risposta

14

Si può sicuramente sovrapporre le viste. Basta aggiungere la sovrapposizione trasparente come sottoview in tableView.

Dalla documentazione del UIView:

oggetti UIView sono disposti all'interno di un oggetto UIWindow, in una gerarchia annidata di subviews. Gli oggetti padre nella gerarchia della vista sono chiamati supervisioni e i bambini sono chiamati sottoview. Un oggetto vista rivendica una regione rettangolare della sua superview enclosure, è responsabile di tutti i disegni all'interno di quella regione ed è idonea a ricevere anche eventi che si verificano in essa. Le visualizzazioni di pari livello sono in grado di sovrapporsi senza problemi, consentendo il posizionamento di una vista complessa.

+0

Interface Builder mi ha ingannato! So che NSViews non può sovrapporsi, e se crei UIViews sovrapposte in IB, le segnalerà con avvisi. Grazie per avermi messo dritto. – benzado

1

Qualsiasi oggetto che risiede in MainWindow.xib può accedere alla finestra dell'applicazione tramite una presa. Il delegato dell'applicazione nei progetti standard lo ha già, ma probabilmente vorrai aggiungere la presa al tuo controller di visualizzazione che deve mostrare l'overlay di avanzamento.

Dal momento che in UIKit l'UIWindow è un UIView (a differenza NSWindow vs. NSView in Cocoa), si può semplicemente aggiungere il tuo vista progresso come una visualizzazione secondaria della finestra:

[window addSubview:progressView];

progressView coprirà l'intero interfaccia utente dell'applicazione.

Questo esempio utilizza la tecnica per sfumare l'immagine spruzzata Default.png:

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


In relazione alla recente modifica, come di MacOS X 10.5 La sovrapposizione di Leopard NSView è deterministica (potrebbero sempre sovrapporsi, hai appena ottenuto risultati indeterminati), sebbene abbia un diverso ordinamento fronte-retro a seconda che la vista contenente sia protetta da un layer o meno. Questo è probabilmente un effetto collaterale dell'integrazione dei CALayer nel sistema di visualizzazione di OS X.

-1

Risposta: I documenti delle mele sono davvero fantastici. http://developer.apple.com/iphone/library/featuredarticles/ViewControllerPGforiPhoneOS/Introduction/Introduction.html

Attualmente mi occupo di sovrapporre viste trasparenti (almeno sul retro di un tovagliolo a questo punto). Puoi usarli per tenere premuti i pulsanti del menu, spostarli nello spazio 3D, solo impazzire.

Voglio dire, questo è un trattato religioso o cosa? Oggetti fantastici dei ragazzi di NEXT:

Gli oggetti UIView sono disposti all'interno di un oggetto UIWindow, in una gerarchia nidificata di sottoview. Gli oggetti padre nella gerarchia della vista sono chiamati supervisioni e i bambini sono chiamati sottoview. Un oggetto vista rivendica una regione rettangolare della sua superview enclosure, è responsabile di tutti i disegni all'interno di quella regione ed è idonea a ricevere anche eventi che si verificano in essa. Le visualizzazioni di pari livello sono in grado di sovrapporsi senza problemi, consentendo il posizionamento di una vista complessa.

15

ho appena postato una versione HUD di mine: https://github.com/y0n3l/LGViewHUD

è possibile ottenere questo risultato molto facilmente:

#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

volta che il compito è finito, basta invoca

[[LGViewHUD defaultHUD] hideWithAnimation:HUDAnimationHideFadeOut]; 

e il gioco è fatto!

+0

Grazie per questa soluzione open source – shkschneider

+0

Grazie mille per aver condiviso, è fantastico! – kernix

9

ci sono anche l'abbastanza famoso MBProgressHUD & SVProgressHUD
Sono dello stesso tipo di @yonel l' HUD

Esempio

[SVProgressHUD show]; 
[SVProgressHUD dismiss]; 

SVProgressHUD Examples MBProgressHUD sembra ora più popolare (se base su stelle github)

+1

SVProgress ha funzionato molto bene per me. Sembra semplice ma flessibile. Nota, usa la versione 'head' per la compatibilità con iOS 7. – Nick

+0

E 'possibile aggiungere un'immagine al posto dello spinner in SVProgressHUD ?? – Ramakrishna

Problemi correlati