使用CoreAnimation“折叠”NSWindow

时间:2012-06-09 16:21:29

标签: macos core-animation nswindow transformation appkit

所以我对AppKit和Cocoa(来自UIKit和CocoaTouch)相当新,我正在实现一个折叠NSWindow的界面。在iOS上,这将是相当容易的,但看看我选择询问的OS X有很多细微差别。

您将如何实施以下过渡?

Window Fold

注意:底栏是我的contentView的一部分,而不是OS X提供的底栏。即我的窗口(顺便说一下,INAppStoreWindow)由titleBar和contentView组成。

我想我可以只是折叠contentView并同步调整窗口大小,但是如果我能够在折叠时保留透明度,这是因为透视转换而发生的。即向内弯曲的边应该(在过渡期间)是透明的。或者我是否想过这个?

1 个答案:

答案 0 :(得分:2)

首先是坏消息:与UIKit不同,AppKit并没有使用Core Animation来呈现其控件。所有CALayers都在NSView的特殊层托管实例中占据了他们自己的世界。因此,除非您的窗口的内容视图是图层托管,否则您无法将CAAnimations作为整体应用于整个窗口的内容而没有相当程度的hackery(可能会将整个内容视图呈现为位图,将其设置为图层的内容,然后对其执行转换。我不确定。

希望您的内容视图基于Core Animation。如果是这样,您描述的方法应该有效。您还应该能够在透明的无边框NSWindow中托管图层,然后您对内容视图所做的任何转换都将显示其背后的桌面。这是一个片段(来自Matt Long)应该做你想做的事情:

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