2010-11-23 3 views
7

Mon objectif est de dessiner un bouton invisible au-dessus de la barre d'état en haut de mon application iPhone (dimension 320 * 20 pixels).Mettre une UIView ou une UIWindow au-dessus de la barre d'état

Peu importe ce que j'essaie, quelque chose est bogué:

  1. Par exemple, j'ai essayé de créer une nouvelle vue. Quand je veux placer la vue sur le dessus de mon application, elle disparaît toujours derrière la barre d'état au lieu d'être devant elle!

  2. Je trouve une autre grande idée sur Stackoverflow: Add UIView Above All Other Views, Including StatusBar Même si une deuxième UIWindow n'est pas recommandé, j'ai essayé de le mettre en œuvre. Cela a fonctionné comme je le souhaitais jusqu'au moment où j'ai remarqué un problème: le clavier n'apparaît plus en cas de besoin (par exemple en cliquant dans une zone de texte)!

Comment puis-je résoudre ce problème? Ou y a-t-il une meilleure approche à mon problème? Ceci est mon code pour créer la deuxième fenêtre:

// Create window 
statusWindow = [[UIWindow alloc] initWithFrame:CGRectMake(0,0,320,20)]; 
statusWindow.windowLevel = UIWindowLevelStatusBar; 
[statusWindow makeKeyAndVisible]; 

// Create statusBarButton 
statusBarButton = [UIButton buttonWithType:UIButtonTypeCustom]; 
CGRect buttonFrame2 = statusBarButton.frame; 
buttonFrame2.size = CGSizeMake(320,20); 
statusBarButton.frame = buttonFrame2; 
[statusBarButton addTarget:self action:@selector(goTop) forControlEvents:UIControlEventTouchUpInside]; 

// Place button into the new window 
[statusWindow addSubview:statusBarButton]; 

Répondre

8

Dans la documentation - [UIWindow makeKeyAndVisible]:

C'est une méthode pratique pour rendre le récepteur de la fenêtre principale et affiche en face d'autres fenêtres. Vous pouvez également masquer et révéler une fenêtre en utilisant la propriété cachée héritée de UIView.

La "fenêtre de clé" est celle qui obtient certains événements d'entrée; Les champs de texte dans une fenêtre sans clé peuvent ne pas fonctionner. Il y a deux choses que vous pouvez faire:

  • appel [fenêtre makeKeyAndVisible] sur la ancienne fenêtre clé après
  • Set statusWindow.hidden = NO à la place (mais je ne vois pas pourquoi il serait caché par défaut). Je ne pense pas que vous pouvez "l'afficher devant les autres fenêtres" comme -makeKeyAndVisible; les fenêtres n'ont pas de vue d'ensemble, vous pouvez appeler -bringSubviewToFront: sur IIRC.
+0

Bonjour, c'est génial! D'abord je ne croyais pas que ça pouvait marcher, mais ça l'a vraiment fait! Merci beaucoup de m'avoir fait gagner du temps et de la frustration! :-) – andreas

+0

Quelle méthode avez-vous utilisé? –

+0

Voir mon dernier message: J'ai dû supprimer la commande "statusWindow makeKeyAndVisible" et utiliser "statusWindow.hidden = NO" à la place. À la fin de tout le code j'ai ajouté "window makeKeyAndVisible" donc l'application sait qu'elle doit montrer le clavier là. Ça a marché! J'espère que Apple acceptera cette solution. – andreas

0

Essayez:

[self.view bringSubviewToFront:statusWindow]; 

Je ne pense pas que son possible pour apporter une vue en face de la barre d'état cependant.

+0

Malheureusement, je ne pouvais pas le faire fonctionner. La seule façon de le faire est d'ajouter un nouveau (ce qui n'est normalement pas recommandé!). – andreas

7

Si d'autres utilisateurs veulent mettre en œuvre, ici ma solution:

// Create window 
statusWindow = [[UIWindow alloc] initWithFrame:CGRectMake(0,0,320,20)]; 
statusWindow.windowLevel = UIWindowLevelStatusBar; 
// Dont make the statusWindow keyWindow or the keyboard won't work! 
// [statusWindow makeKeyAndVisible]; 

// Create statusBarButton 
statusBarButton = [UIButton buttonWithType:UIButtonTypeCustom]; 
CGRect buttonFrame2 = statusBarButton.frame; 
buttonFrame2.size = CGSizeMake(320,20); 
statusBarButton.frame = buttonFrame2; 
[statusBarButton addTarget:self action:@selector(goTop) forControlEvents:UIControlEventTouchUpInside]; 

// Place button into the new window 
[statusWindow addSubview:statusBarButton]; 

// Instead, add this: 
[window makeKeyAndVisible]; // has to be main window of app 
statusWindow.hidden = NO; // without this the statusWindow won't appear 
+1

Ce code ne semble pas fonctionner. Vous n'allez pas ajouter 'statusWindow' à votre hiérarchie de vue autant que je peux dire. Comment l'obtenez-vous apparaître? – jbrennan

+0

J'ai déclaré window et statusWindow dans mon fichier h et fait synthétiser dans mon fichier m. Rien d'autre n'a été fait pour autant que j'ai vérifié! S'il vous plaît noter que mon bouton est invisible et seulement en haut de la barre d'état et appellera la fonction goTop qui doit être déclarée. La rotation de l'application iPhone va également le perturber, donc vous devrez redimensionner le bouton. – andreas

+0

Ce dosen't travail pour moi non plus, ce code est à l'AppDelegate? – Raspu

7

dans le fichier AppDelegate

self.window.windowLevel = UIWindowLevelStatusBar; 

ou dans toute autre classe

[AppDelegate appDelegate].window.windowLevel = UIWindowLevelStatusBar; 

et si vous vouloir faire barre de statut pour être sur le dessus à nouveau vous pouvez définir

self.window.windowLevel = UIWindowLevelNormal; 
Questions connexes