2012-06-09 11 views
5

Also ich bin ziemlich neu in AppKit und Cocoa (kommt von UIKit mit CocoaTouch) und ich implementiere derzeit eine Schnittstelle, um ein NSWindow zu falten. Auf iOS wäre das ziemlich einfach, aber ich sehe, dass es viele kleine Unterschiede zu OS X gibt, die ich stellen möchte."Falten" ein NSWindow mit CoreAnimation

Wie würden Sie den folgenden Übergang implementieren?

Window Fold

Hinweis: Der untere Balken Teil meines content ist und nicht auf die untere Leiste OS X zur Verfügung stellt. I.e. Mein Fenster (übrigens INAppStoreWindow) besteht aus einer titleBar und einer contentView.

Ich denke, ich könnte einfach die contentView falten und die Größe des Fensters synchron ändern, aber es wäre besser, wenn ich die Transparenz beim Falten bewahren könnte, was aufgrund der perspektivischen Transformation passiert. I.e. Die nach innen gebogenen Seiten sollten (während des Übergangs) transparent sein. Oder überschätze ich das?

Antwort

2

Schlechte Nachrichten zuerst: Im Gegensatz zu UIKit verwendet AppKit keine Core-Animation zum Rendern seiner Steuerelemente. Alle CALayers bewohnen ihre eigene Welt innerhalb spezieller Layer-Hosting-Instanzen von NSView. Wenn also die Inhaltsansicht Ihres Fensters kein Layer-Hosting ist, können Sie keine CAAnimations auf den Inhalt Ihres Fensters als Ganzes anwenden, ohne eine angemessene Menge an Hacking (es könnte möglich sein, die gesamte Inhaltsansicht in eine Bitmap zu rendern, setze das als Inhalt einer Ebene und führe die Transformation dafür aus. Ich bin mir nicht sicher).

Hoffentlich ist Ihre Inhaltsansicht Core-Animation-basiert. Wenn dies der Fall ist, sollte der von Ihnen beschriebene Ansatz funktionieren. Sie sollten auch in der Lage sein, den Layer in einem transparenten, randlosen NSWindow zu hosten, und alle Transformationen, die Sie an der Inhaltsansicht vornehmen, zeigen den dahinter liegenden Desktop. Hier ist ein Ausschnitt (von Matt Long), der tun sollte, was Sie wollen:

- (id) initWithContentRect: (NSRect) contentRect 
       styleMask: (unsigned int) aStyle 
        backing: (NSBackingStoreType) bufferingType 
        defer: (BOOL) flag 
{ 
    if (![super initWithContentRect: contentRect 
          styleMask: NSBorderlessWindowMask 
          backing: bufferingType 
         defer: flag]) return nil; 
    [self setBackgroundColor: [NSColor clearColor]]; 
    [self setOpaque:NO]; 

    return self; 
} 
+0

Ja meine Content-View ist CoreAnimation basiert, und mir ist dieser Fall bekannt. Das Problem mit NSBorderlessWindowMask ist, dass wenn ich die Hintergrundfarbe auf clearColor setze, das System einen Fensterschatten zeichnet. Sicher, ich könnte einfach weitermachen und mein eigenes machen, aber das wäre im Grunde so, als würde ich mein eigenes Fenster komplett zeichnen. Ich möchte das wegen der möglichen Änderung der Schnittstelle in späteren Versionen von OS X vermeiden. – pkluz

+0

Ihr Problem mit dem Fensterschatten ist ziemlich das selbe wie das mit den Standardkontrollen. AppKit wird von der Kernanimation nicht gerendert, daher kann alles, was es darstellt, nicht mit Kernanimation verwendet werden. Sie müssen darauf verzichten oder es selbst neu implementieren. Es ist scheiße, ich weiß. Ich denke, es ist nur ein Teil des Gepäcks, das mit der Arbeit an einer älteren ... –