2012-06-09 13 views
5

Jestem więc całkiem nowy dla AppKit i Cocoa (pochodzącego z UIKit z CocoaTouch) i obecnie implementuję interfejs do złożenia NSWindow. W systemie iOS byłoby to dość łatwe, ale widzę, jak wiele różnic w stosunku do OS X mogę zadać."Złóż" NSWindow używając CoreAnimation

W jaki sposób wdrożysz następujące przejście?

Window Fold

Uwaga: Dolny pasek jest częścią mojego contentView i nie dolny pasek OS X udostępnia. To znaczy. moje okno (INAppStoreWindow by the way) składa się z titleBar i contentView.

Zgaduję, że mógłbym po prostu złożyć zawartość i zsynchronizować okno w sposób synchroniczny, ale byłoby lepiej, gdybym był w stanie zachować przezroczystość podczas składania, co ma miejsce z powodu transfuzji perspektywy. To znaczy. boki, które są zgięte do wewnątrz, powinny (podczas przejścia) być przezroczyste. Czy mogę to przemyśleć?

Odpowiedz

2

Zła wiadomość: w przeciwieństwie do UIKit AppKit nie używa Core Animation do renderowania swoich kontrolek. Wszystkie CALayery zamieszkują własny świat w specjalnych instancjach NSView. Więc jeśli widok zawartości twojego okna nie jest hostem warstwy, nie możesz zastosować CAAnimations do zawartości twojego okna jako całości bez uczciwego stopnia hackery (może być możliwe renderowanie całego widoku zawartości do bitmapy, ustaw to jako zawartość warstwy i wykonaj transformację na tym. Nie jestem pewien).

Mam nadzieję, że widok zawartości jest oparty na animacji rdzeniowej. Jeśli tak, to podejście, które opisujesz, powinno działać. Powinieneś także móc hostować warstwę w przezroczystym, bez obramowania, NSWindow, a następnie wszelkie przekształcenia dokonane w widoku treści ujawnią pulpit za nim. Oto fragment (od Matt Long), który powinien zrobić to, co chcesz:

- (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

Tak, mój widok treści oparty jest na CoreAnimation i jestem świadomy tej pułapki. Problem z NSBorderlessWindowMask polega na tym, że jeśli ustawię kolor tła na clearColor, system narysuje cień okna. Pewnie, że mógłbym po prostu zrobić to samo, ale w zasadzie byłoby to zupełnie jak rysowanie własnego okna. Chciałbym tego uniknąć ze względu na potencjalną zmianę interfejsu w późniejszych wersjach OS X. – pkluz

+0

Twój problem z cieniem okna jest prawie taki sam, jak ten ze standardowymi kontrolkami. AppKit nie jest renderowany przez rdzenną animację, więc wszystko, co powoduje, że nie można używać animacji rdzenia. Zrobiłeś to bez niego lub zreimplementowałeś go sam. To jest do bani, wiem. Myślę, że to tylko część bagażu, który pochodzi z pracy nad starszym interfejsem ... –

Powiązane problemy