2011-01-08 4 views
0

Ich habe einen ziemlich einfachen Bildschirmschoner erstellt, der ohne Probleme auf Mac OS 10.6.5 läuft.Wie aktiviert man eine benutzerdefinierte Bildschirmschoner Vorschau in Cocoa/Obj-C?

Der Konfigurationsbildschirm hat ziemlich viele verschiedene Optionen angesammelt und ich versuche, eine eigene Vorschau im configureSheet Fenster zu implementieren, so dass der Benutzer (nur ich, derzeit) sofort die Auswirkungen einer Änderung sehen kann ohne OK und Testen Sie jede Änderung.

Ich habe eine NSView dem configureSheet hinzugefügt und die benutzerdefinierte Klasse in Interface Builder auf meine ScreenSaverView-Unterklasse festgelegt. Ich weiß, dass drawRect: feuert, weil ich die Bedingung zum Löschen der Ansicht auf schwarz entfernen kann, und meine benutzerdefinierte Vorschau nicht mehr mit dem schwarzen Hintergrund angezeigt wird. Hier ist die Funktion (basierend auf mehreren feinen Tutorials im Internet):

- (void)drawRect:(NSRect)rect 
{ 
    if (shouldDrawBackground) 
    { 
     [super drawRect:rect]; 
     shouldDrawBackground = NO; 
    } 
    if (pausing == NO) 
     [spiroForm drawForm]; 
} 

Die spiroForm Klasse einfach zieht sich in die ScreenSaverView Rahmen mit NSBezierPath und, wie erwähnt, ist nicht problematisch für den eigentlichen Bildschirmschoner oder den eingebauten -in Vorschau der Systemeinstellungen. Die benutzerdefinierte Vorschau (configureView) Rahmen wird in die init-Methode übergeben für, äh, selbst (da seine eigene Klasse meine ScreenSaverView Unterklasse ist.) Die -initWithFrame Methode in configureSheet aufgerufen wird, bevor das configureSheet Objekt zum OS Rückkehr:

[configureView initWithFrame:[configureView bounds] isPreview:YES]; 

Vielleicht muss ich das nicht tun? Es war nur etwas, was ich versuchte zu sehen, ob es zum Zeichnen benötigt wurde.

Ich habe schließlich einen Delegierten zum configureSheet die startAnimation und stopAnimation Funktionen meiner Vorschau über windowWillBeginSheet und windowWillEndSheet Benachrichtigungen versuchen Auslösung, aber die scheinen nicht aus irgendeinem Grund genannt zu werden, zu werden. Der Delegat wird als NSObject <NSWindowDelegate> deklariert, und ich setze den Delegaten in der ConfigureSheet-Methode, bevor das Objekt configureSheet zurückgegeben wird.

Ich habe seit Tagen daran gearbeitet, konnte aber nichts darüber herausfinden, wie das OS die ScreenSaverView-Objekte verwaltet (was ich glaube, was ich versuche zu emulieren, indem ich meine eigene Kopie ausführe).

Hat jemand irgendwelche Vorschläge, wie dies zu verwalten ist oder ob Apple es irgendwo dokumentiert, dass ich nicht gefunden habe? Dies ist nicht wirklich erforderlich, damit der Bildschirmschoner funktioniert, ich denke nur, dass es Spaß machen würde (ich suchte auch nach einer Möglichkeit, die OS-Vorschau zu verwenden, aber sie ist blockiert, während configureSheet aktiviert ist.)

+0

Bitte nehmen Sie sich die Zeit, um Ihren Code korrekt zu formatieren, indem Sie die Editor-Steuerelemente verwenden. –

+0

Danke für die Bearbeitung, ich bin kein häufiges Web-Poster und habe die Editor-Steuerung erst bemerkt, als ich deinen Kommentar gesehen habe. – David

Antwort

0

OK, da sind ein paar 'duh'-Momente mit der Lösung:

Zunächst habe ich den Delegaten für die Blattbenachrichtigungen auf das Blatt selbst gesetzt. Das Fenster, das das Blatt zu gehört, erhält die Benachrichtigungen. Zweitens gehört das Fenster, zu dem das Blatt gehört, zu den Systemeinstellungen. Ich sehe keine Möglichkeit, meine Delegiertenklasse als Delegat für dieses Fenster festzulegen, sodass die gesamte Delegat-Sache nicht zu sein scheint eine praktikable Lösung.

Ich beendete NSWindow für das configureSheet, so dass ich Animation in meiner Vorschau starten und stoppen konnte, indem ich die makeKeyWindow und schließen Methoden überging.

- (void) makeKeyWindow 
{ 
    if (myPreview != nil) 
     if (! [myPreview isAnimating]) 
     { 
     [myPreview startAnimation]; 
     } 
    [super makeKeyWindow]; 
} 

Ich musste auch ein IBOutlet für mein Vorschauobjekt selbst hinzufügen und es in Interface Builder verbinden.

Noch ein paar Probleme, aber jetzt, wenn ich auf meine Bildschirmschoner Schaltfläche Optionen klicke, wird mein configureSheet heruntergeklappt und zeigt eine eigene Vorschau, während Sie Optionen einstellen. Meine Güte. Die Reifen, die ich für diese kleinen Feinheiten durchspringe. Wie auch immer, ich mag es. Vorwärts und aufwärts.

Verwandte Themen