2009-09-01 9 views
2

Je travaille sur une application dont la fenêtre principale a un NSDrawer. Il est crucial que le tiroir s'ouvre toujours sur le bord droit, et c'est ainsi que je l'ai codé pour fonctionner. Ce que je voudrais savoir, c'est s'il y a un moyen de détecter si le tiroir va s'ouvrir "hors de l'écran" ... Y at-il un moyen de le détecter? Si c'est le cas, comment? Et puis comment puis-je déplacer la fenêtre principale pour ajuster la largeur du tiroir qui va s'ouvrir?Comment détecter si NSDrawer va s'ouvrir

Merci d'avance.

Nick

EDIT:

Voici la solution grâce à la suggestion de Rob.

-(IBAction)toggleDrawer:(id)sender 
{ 

NSRect screenFrame = [[[NSScreen screens] objectAtIndex:0] visibleFrame]; 
NSRect windowFrame = [window frame]; 
NSRect drawerFrame = [[[drawer contentView] window] frame]; 

if ([drawer state] == NSDrawerOpenState) 
{ 
    [drawer close]; 
} 
else 
{ 
    if (windowFrame.size.width + 
     windowFrame.origin.x + 
     drawerFrame.size.width > screenFrame.size.width) 
    { 
     NSLog(@"Will Open Off Screen"); 

     float offset = (windowFrame.size.width + 
        windowFrame.origin.x + 
        drawerFrame.size.width) - screenFrame.size.width; 

     NSRect newRect = NSMakeRect(windowFrame.origin.x - offset, 
              windowFrame.origin.y, 
              windowFrame.size.width, 
              windowFrame.size.height); 

     [window setFrame:newRect display:YES animate:YES]; 
    } 

    [drawer openOnEdge:NSMaxXEdge];  
} 
} 

Répondre

4

Vous pouvez utiliser les méthodes de NSScreen pour calculer si le cadre du tiroir élargi ouvrirait hors de l'écran, puis utilisez le -setFrame: Affichage: Animer: pour déplacer la fenêtre la distance requise loin de l'écran bord avant d'ouvrir le tiroir.

+1

Parfait. Je vous remercie. Pour toute personne intéressée, j'ai ajouté le code que j'ai utilisé pour la question. – nrj

+0

Solution soignée, vous deux! Cela pourrait être une option pour soustraire le 'offset' dans' newRect' de la largeur au lieu de l'origine. –