我想在我的应用程序NSWindow
上使用一些漂亮的流行动画。我已经知道如何为所有不同类型的CALayerBacked实体制作动画,但我无法确定是否有办法为NSWindow
的框架设置动画更改动画。
我遇到的问题是,我可以为NSWindow
的contentView设置动画(因为它是CALayerBacked),但不是NSWindow
的位置和大小本身。
我知道,我可以简单地调用setFrame:display:animate:
,但这并不像pop框架那样提供相同的平滑动画。
kPOPViewFrame 不可用。我改为使用 kPOPLayerBounds :
有没有办法实现这个目标?
答案 0 :(得分:1)
您可以在任何您喜欢的对象上创建自己的自定义属性:
+ (id)propertyWithName:(NSString *)aName initializer:(void (^)(POPMutableAnimatableProperty *prop))aBlock
你会为NSWindow设置一个这样的东西......
POPAnimatableProperty *windowPositionProperty = [POPAnimatableProperty propertyWithName:@"com.myname.NSWindow.position" initializer:^(POPMutableAnimatableProperty *prop) {
prop.readBlock = ^(NSWindow *window, CGFloat values[]) {
values[0] = window.frame.origin.x;
values[1] = window.frame.origin.y;
};
prop.writeBlock = ^(NSWindow *window, const CGFloat values[]) {
[window setFrameOrigin:CGPointMake(values[0], values[1])];
};
}];
请注意文档注释“自定义属性应使用反向DNS命名。”
然后像这样设置动画:
POPSpringAnimation *endBounce = [POPSpringAnimation animation];
endBounce.property = windowPositionProperty;
endBounce.toValue = [NSValue valueWithCGPoint:targetPosition];
[window pop_addAnimation:endBounce forKey:@"endBounce"];