使用CoreAnimation"折叠"NSWindow

pkl*_*luz 5 macos core-animation transformation appkit nswindow

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

您将如何实施以下过渡?

窗口折叠

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

我想我可以只是折叠contentView并同步调整窗口的大小,但如果我能够在折叠时保留透明度,这是因为透视转换所致.即向内弯曲的侧面(在过渡期间)应该是透明的.还是我在思考这个?

Chr*_*eux 2

首先是坏消息:与 UIKit 不同,AppKit 不使用 Core Animation 来渲染其控件。所有 CALayers 都在 NSView 的特殊层托管实例中拥有自己的世界。因此,除非您的窗口的内容视图是图层托管的,否则您无法将 CAAnimations 应用于整个窗口的内容,而无需相当程度的黑客攻击(可以将整个内容视图渲染为位图,将其设置为图层的内容,然后对其执行转换。我不确定)。

希望您的内容视图是基于核心动画的。如果是这样,您描述的方法应该有效。您还应该能够将图层托管在透明的无边框 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;
}
Run Code Online (Sandbox Code Playgroud)