JNWAnimatableWindow
JNWAnimatableWindow
是一个 NSWindow
子类,它在窗口上添加了一个 layer
属性,使您能够按照自己的意愿对其进行动画化。
入门
JNWAnimatableWindow
提供了层属性和一系列将窗口向前或向后排序的方法,以简化常见动画。如果需要手动对窗口进行动画处理,并且窗口已经可见,可以直接操作窗口的 layer
属性。
以下方法用于使用隐式动画来动画化窗口
- (void)orderOutWithDuration:(CFTimeInterval)duration timing:(CAMediaTimingFunction *)timingFunction animations:(void (^)(CALayer *windowLayer))animations;
- (void)makeKeyAndOrderFrontWithDuration:(CFTimeInterval)duration timing:(CAMediaTimingFunction *)timingFunction setup:(void (^)(CALayer *windowLayer))setup animations:(void (^)(CALayer *layer))animations;
- (void)setFrame:(NSRect)frameRect withDuration:(CFTimeInterval)duration timing:(CAMediaTimingFunction *)timing;
如果希望显式地动画化窗口,可以使用以下方法
- (void)orderOutWithAnimation:(CAAnimation *)animation;
- (void)makeKeyAndOrderFrontWithAnimation:(CAAnimation *)animation;
所有这些方法都在头文件文档中进行了详细说明。
示例
关闭
[self.window orderOutWithDuration:0.7 timing:nil animations:^(CALayer *layer) {
layer.opacity = 0.f;
}];
打开
[self.window makeKeyAndOrderFrontWithDuration:0.7 timing:nil setup:^(CALayer *layer) {
// Setup is not animated
layer.opacity = 0.f;
} animations:^(CALayer *layer) {
// This is animated
layer.opacity = 1.f;
}];
框架更改
[self.window setFrame:newFrame withDuration:0.7 timing:nil];
显式动画
CABasicAnimation *opacity = [CABasicAnimation animationWithKeyPath:@"opacity"];
opacity.toValue = @0;
[self.window orderOutWithAnimation:opacity];
更多信息
在便捷方法中,所有操作都被包裹在一个动画的CATransaction
中,因此您可以修改任何层属性并且它应该会自动动画化。另外注意,传递 nil 给延时函数将导致使用默认的 ease-in-out 动画。
如果只是想让您的窗口像大佬一样随心所欲地在屏幕上飞来飞去,可以直接使用JNWAnimatableWindow
的layer
属性。首次访问此属性时,它会惰性创建一个窗口的图像表示并将其放置在层中,然后该层就能进行动画化。当您完成层的使用后,您需要负责调用-destroyTransformingWindow
,这将移除额外的窗口并释放资源。如果您使用上面列出的便捷方法之一,则不需要这样做。
查看演示以获取更多示例,查看头文件以获取更完整的文档。
限制
由于NSWindow
的工作方式,这个库提供的一些功能存在一些大的限制。它通过获取窗口的图像表示并将其放置在额外的不透明全屏窗口中的层来实现。由于这种静态表示,如果层显示时窗口更新了内容,则该更改将不会在层中反映。因此,这个类更适合于在内容最不可能变化的时间内进行的短暂动画,例如在窗口打开或关闭时。
许可
JNWAnimatableWindow
遵循MIT
许可证。请参阅MIT许可证。查看LICENSE.md。
但老实说,我最关心的是您能把这个库用起来。我想帮助让OS X开发变得友好,这是我的一个尝试。如果您使用这个库,请务必在Wiki上注明,或者与我联系,我会为您完成。
联系方式
您可以通过Twitter关注我:@j_willing,通过在我GitHub个人资料上列出的邮箱联系我,或者在jwilling.com阅读我的博客。