2010-12-15 87 views
8

Plusieurs applications, y compris le carnet d'adresses intégré, utilisent une fenêtre HUD semi-transparente avec un grand texte ombré. Je voudrais implémenter une fenêtre similaire dans mon application Cocoa Mac.Comment implémenter une fenêtre de style HUD comme "Afficher en grand"

screenshot

Y at-il une implémentation libre de ce genre de fenêtre quelque part?

Sinon, quelle est la meilleure façon de l'implémenter?

Répondre

22

Voici un exemple de projet qui montre comment le faire:

http://github.com/NSGod/BlackBorderlessWindow

Fondamentalement, vous devez créer une sous-classe NSWindow sans frontières. La méthode la plus simple consiste à définir la taille et l'agencement de votre fenêtre dans le fichier nib, puis à définir sa classe comme votre sous-classe personnalisée. Ainsi, même si cette fenêtre ressemble toujours à une fenêtre normale dans Interface Builder, elle apparaîtra à l'exécution comme vous le souhaitez.

@implementation MDBorderlessWindow 

- (id)initWithContentRect:(NSRect)contentRect 
      styleMask:(NSUInteger)windowStyle 
       backing:(NSBackingStoreType)bufferingType 
       defer:(BOOL)deferCreation { 

    if (self = [super initWithContentRect:contentRect 
          styleMask:NSBorderlessWindowMask 
           backing:NSBackingStoreBuffered defer:deferCreation]) { 
      [self setAlphaValue:0.75]; 
      [self setOpaque:NO]; 
      [self setExcludedFromWindowsMenu:NO]; 
    } 
    return self; 
} 

La valeur alpha rendra la fenêtre semi-transparente.

En outre, vous pouvez créer une sous-classe NSView qui dessinera un rectangle arrondi:

@implementation MDBlackTransparentView 

- (id)initWithFrame:(NSRect)frame { 
    if (self = [super initWithFrame:frame]) { 

    } 
    return self; 
} 

- (void)drawRect:(NSRect)frame { 
    NSBezierPath *path = [NSBezierPath bezierPathWithRoundedRect:frame 
            xRadius:6.0 yRadius:6.0]; 
    [[NSColor blackColor] set]; 
    [path fill]; 
} 

@end 

Comme avec la fenêtre, vous définissez simplement la classe de contentView de la fenêtre pour être votre sous-classe personnalisée NSView. (Utilisez le mode d'affichage hiérarchique et cliquez sur le triangle d'affichage pour afficher le NSView imbriqué à l'intérieur de l'icône de la fenêtre dans le fichier nib). Encore une fois, alors que la vue semblera ordinaire dans Interface Builder, elle sera correcte à l'exécution.

Ensuite, placez simplement un NSTextField en haut de la vue et définissez le texte en conséquence. Notez que, en général, les fenêtres sans bordures ne sont pas faciles à utiliser (par exemple, si vous voulez pouvoir faire glisser la fenêtre, vous devrez l'ajouter vous-même). Apple a un exemple de code sur la façon d'autoriser le glisser, par exemple.

alt text

+0

Exactement ce que je cherchais. Drôle, même l'application de démonstration utilisait exactement le même exemple de texte "1-800-MY-APPLE". – amrox

+2

@amrox: Eh bien, j'ai fait la démo en particulier ;-) (En fait, j'avais déjà un exemple de projet de fenêtre sans bordure, il ne m'a fallu qu'une minute pour la modifier pour faire ce que vous vouliez). – NSGod

+0

Maintenant, ce serait génial si quelqu'un faisait cela dans un service OSX dans lequel vous pourriez simplement introduire du texte. Il y avait une application comme celle-ci (LargeType 1.0) mais elle a été abandonnée et les téléchargements ont été supprimés (!?). Vous êtes prêt pour ça NSGod? – davemyron

3

Merci de partager ce code. M'a beaucoup aidé! Vous pouvez ajouter la ligne suivante ...

[self setBackgroundColor:[NSColor clearColor]]; 

à la fonction d'initialisation de la fenêtre. Cela supprime les coins blancs.