fullScreen et keyDown
Bonjour à tous
J'ai un souci en mode fullScreen : je n'arrive pas à accéder à keyDown pour sortir du mode full screen. Voici le code :
-(IBAction)fullScreen:(id)sender
{
isInFullScreenMode = YES;
NSRect mainDisplayRect;
// Create a screen-sized window on the display you want to take over
// Note, mainDisplayRect has a non-zero origin if the key window is on a secondary display
mainDisplayRect = [[NSScreen mainScreen] frame];
fullScreenWindow = [[NSWindow alloc] initWithContentRect:mainDisplayRect styleMask:NSBorderlessWindowMask
backing:NSBackingStoreBuffered defer:YES];
// Set the window level to be above the menu bar
[fullScreenWindow setLevel:NSMainMenuWindowLevel+1];
// Perform any other window configuration you desire
[fullScreenWindow setOpaque:YES];
[fullScreenWindow setHidesOnDeactivate:YES];
qtMovieFullScreen = [[QTMovieFullScreen alloc] init];
qtMovieFullScreen.movie = [self movie];
[qtMovieFullScreen setPreservesAspectRatio:YES];
[qtMovieFullScreen setControllerVisible:YES];
[fullScreenWindow setContentView:qtMovieFullScreen];
// Show the window
[fullScreenWindow makeKeyAndOrderFront:self];
}
J'ai sous classé le QTMovieView qui doit apparaà®tre dans le fullScreen. J'obtiens bien une réponse si je fais un click, mais je ne passe pas dans keyDown si je tappe une touche. Voici le code de la sous classe QTMovieFullScreen (de classe QTMovieView):
#import "QTMovieFullScreen.h"
@implementation QTMovieFullScreen
- (id)initWithFrame:(NSRect)frame
{
self = [super initWithFrame:frame];
if (self) {
// Initialization code here.
}
return self;
}
- (void)drawRect:(NSRect)dirtyRect
{
// Drawing code here.
}
-(void) mouseDown:(NSEvent *)theEvent
{
}
- (BOOL)acceptsFirstResponder {
return YES;
}
- (void) keyDown:(NSEvent *)event
{
unichar c = [[event charactersIgnoringModifiers] characterAtIndex:0];
switch (c) {
case 27:
// Test
break;
default:
break;
}
}
Quelqu'un peut il me dire ce qu'il ne va pas ? ou encore, peut être que je m'y prends mal et dans ce cas, comment afficher un QTMovie en fullScreen puis retourner la la fenêtre initiale en appuyant sur ESC?
Merci d'avance
Réponses
Si la vue ne reçoit pas le -keydown, c'est qu'elle n'est pas le First Responder.
Mais... a priori, ça devrait plutôt être le rôle de son contrôleur de sortir du fullscreen, donc personnellement, je ferais plutôt en sorte que le contrôleur soit le First Responder.
À mon avis, implémenter -keyDown: dans le contrôleur devrait suffire.
(Je sais que je n'explique pas grand chose, mais cela concerne la chaà®ne des répondeurs, qui est un concept singulier, et si ça ne te parle pas, il faut que tu étudies un peu NSResponder et lise le Cocoa Event Handling Guide).
en quoi?
Essaye en ajoutant dans une sous classe de NSWindow:
bon, j'ai sous classé fullScreenWindow comme le suggère mpergand et ajouter canBecomeKeyWindow, et donc j'ai placé cette fois ci (void) keyDown:(NSEvent *)event dans cette sous classe.
En plaçant un point d'arrêt dans canBecomeKeyWindow , j'y passe bien. Mais pas mieux au final : je ne passe pas dans keyDown
J'ai même placé (BOOL)acceptsFirstResponder {return YES;} dans cette sous classe pour avoir le first responder mais ça ne passe jamais dans cette méthode.
J'ai donc tenté la solution de Céroce et j'ai placé le keyDown dans le NSWindowController mais en vain .
Cela est d'autant surprenant que j'ai fais une appui spécifique pour cela avec un NSDocument qui inclue un QTMovieView qui est sous classé et qui comprend le keyDown. Et là , ça marche très bien.
Dans mon appui de départ, j'ai un NSDocument qui ouvre une fenêtre (NSWindowController) comprenant un QTMovieView sous classé. C'est dans cette sous classe que j'ai copié les méthodes de mon appli spécifique mais je n'ai donc plus d'accès à keyDown
Pourquoi je n'ai plus le first responder ?
Merci d'avance
J'ai trouvé une solution :
Je sous classe bien ma NSWindow de mon fullScreenWindow.
J'y place la méthode de mpegrand :
-(BOOL) canBecomeKeyWindow
{
return YES;
}
et j'insère après
fullScreenWindow = [[MonFullScreen alloc] initWithContentRect:mainDisplayRect styleMask:NSBorderlessWindowMask
backing:NSBackingStoreBuffered defer:YES];
la ligne suivante :
[fullScreenWindow setInitialFirstResponder:self];
Avec ça, j'ai accès à mon KeyDown, qui sera placé dans la même classe que ma méthode "fullScreen" citée dans mon 1er message. Ce keyDown est le suivant :
- (void) keyDown:(NSEvent *)event
{
unichar c = [[event charactersIgnoringModifiers] characterAtIndex:0];
switch (c) {
// [Esc] exits full-screen mode
case 27:
{
isInFullScreenMode = NO;
fullScreenWindow = nil;
}
break;
default:
break;
}
}
Voila
Merci à tous pour vos pistes
Ca t'évitera en plus que des bouts de code comme
soient remplacés par si tu ne les as pas entouré de ces balises pour indiquer que c'est du code source...
Désolé, j'y penserai la prochaine fois
Désolé de revenir mais je viens de m'apercevoir que j'ai un autre souci. Tout fonctionne bien... sauf si je clic dans la QTMovieView (et pas à l'extérieur). En effet, si je clic ou double clic, je n'ai plus la possibilité d'utiliser le keyDown alors que le glissement des doigts fonctionne et n'empêche pas cela.
Quoi faire et pourquoi
merci encore
En cliquant sur la QTMoveView, c'est elle qui prend le focus...
ouais, je suis en effet complètement d'accord avec ça.
Donc j'ai sous-classé ma QTMovieView qui apparait ds le fullScreen en y insérant un KeyDown.
Je passe bien dedans quand je tape "esc", mais du coup, je ne sais plus quoi faire : comment je fais pour quitter ma fullScreen?
J'ai bien une idée mais je ne vois pas comment la réaliser :
via cette touche "esc" dans le keyDown de ma sous-classe de mon QTMovieView affiché ds le fullScreen, repasser dans la classe MonFullScreen (qui gère l'apparition du fullScreen dont le code est écrit un peu plus haut) et en indiquant que ma movieView n'est plus firstResponder (et comment faire)?
Merci d'avance
Désolé mais pour tester le fait que ma movieView ne soit plus le firstResponder, j'avais mis acceptsFirstReponder: return NO; dans ma sous classe de mon QTMovieView qui apparait dans le fullScreen... mais avec une faute "d'orthographe" (oubli du "s"). Donc avec un "s", ça marche très bien !
Désolé - comme on dit, c'est souvent entre l'écran et la chaise que se trouve l'erreur ...