2010-04-19 5 views
27

Je veux créer une vue (UIControl) qui bloque toutes les entrées et affiche une UIActivityIndicatorView lors de l'authentification d'un utilisateur. Les UIActionSheet et UIAlertView parviennent à ajouter une vue semi-transparente noire sur le dessus de toutes les autres vues pour bloquer l'entrée et j'aimerais faire similaire. J'ai essayé d'ajouter ma vue à l'UIWindow supérieure dans le tableau [[UIApplication sharedApplication] windows], et bien que cela le place au-dessus du UIKeyboard s'il est visible, il ne le place pas sur la StatusBar (qui logique).Ajouter UIView sur toutes les autres vues, y compris StatusBar

Ma tentative suivante consistait à étendre UIAlertView, supprimer toutes ses sous-vues et définir son layer.contents = nil, puis ajouter l'ActivityIndicator en tant que sous-vue. Cela fonctionne bien, mais je ne peux pas sembler tuer la transition bouncy par défaut de l'UIAlertView quand vous l'appelez pour "montrer".

Quelqu'un at-il des indications sur la meilleure façon d'aborder ce problème qui me donne un contrôle total? Oh et je sais que le blocage des entrées n'est pas génial mais je m'assure que c'est pour une courte période de temps et il a l'avantage d'indiquer clairement à l'utilisateur que son action, qui doit se terminer pour qu'elles progressent, est en cours de traitement .

+2

Pourquoi "couvrir" la barre d'état? Pourquoi ne pas le cacher, le rendre translucide, ou simplement l'ignorer entièrement? La barre d'état ne répond pas aux touches, si je me souviens bien. –

+5

Je veux qu'il ressemble à la vue de superposition. Cela indique à l'utilisateur qu'il ne peut pas interagir actuellement. Le rendre translucide n'atteint malheureusement pas ceci, et le cacher semblerait étrange si juste pendant la durée de l'authentification. Et il répond bien aux touches. La valeur par défaut est de faire défiler UIScrollView actif vers le haut. –

Répondre

51

Je l'ai fait un peu plus creuser autour de la API et crois que j'ai travaillé.

Pour afficher une vue sur l'intégralité de l'écran, vous devez créer votre propre UIWindow et définir sa propriété windowLevel sur UIWindowLevelStatusBar. Vous pouvez ensuite ajouter vos sous-vues personnalisées à cette fenêtre.

Notez que Apple n'encourage pas, mais n'interdit pas non plus la création de plusieurs fenêtres.

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]; 

Lorsque vous souhaitez supprimer la fenêtre de l'écran, il semble que vous libérer de la mémoire.

[statusWindow release]; 

Cela ne se sent pas tout à fait le choix sûr, mais je ne reçois pas d'erreurs et il semble laisser tomber les fenêtres du UIApplication. S'il vous plaît laissez-moi savoir si c'est faux.

Mise à jour:

Un autre problème que je suis tombé sur était le UIStatusBar ne pas prendre les événements tactiles pour faire défiler le UIScrollView actif au sommet après avoir affiché et retiré cette fenêtre de superposition. La solution consistait à remettre la fenêtre principale dans la fenêtre principale une fois la superposition libérée.

[primaryWindow makeKeyWindow]; 
+2

Ce code ne fonctionne pas pour moi dans iOS 4.2. La fenêtre d'état apparaît, mais pas au-dessus de la barre d'état par défaut fournie par le système d'exploitation. Des conseils? Cela fonctionne-t-il encore pour iOS 4.2? – jbrennan

+0

Cela fonctionne, mais quand je présente un viewController animé, ma fenêtre, qui a un indicateur d'activité derrière le viewController présenté, des solutions à ce problème? –

+1

cela a échoué lorsque Im essayant de faire pivoter l'interface à l'orientation paysage.the statusWindow coller simplement à la position de la barre d'état d'origine. –

1

Je suis sur le point de faire la même chose peu et trouvé ce qui suit

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

On dirait qu'il a tout ce que vous cherchez

+0

Merci pour le lien, mais cela ne couvre pas la barre d'état de ce que je peux voir. Je suis après une vue semi-transparente qui couvrira toute la zone de l'interface utilisateur. –

5

je devais présenter une vue au-dessus de toutes les autres vues au sein de ma fenêtre principale. Au départ, j'ai pensé à présenter une autre fenêtre en haut de ma fenêtre principale. Depuis, Apple décourage en utilisant plusieurs fenêtres, j'ai décidé contre.

Le code suivant a fait l'affaire pour moi:

j'ai ajouté mon avis en tant que vue sous ma fenêtre clé qui présente automatiquement mon point de vue au-dessus de toutes les autres vues. Dans mon cas, ce code est délégué de l'application

[self.window addSubview:topViewController.view] 

Et quand je suis fait le point de vue, le code suivant supprime de la fenêtre.

[topViewController.view removeFromSuperview]; 
+2

cela ne couvrira pas la barre d'état – OpenThread

+0

D'une manière ou d'une autre dans l'application de paysage, cela ajoute une vue en portrait et cela semble très stupide. – Dvole

Questions connexes