如何给NSWindow一个摇动的效果,如NO,如在登录失败窗口 [英] How to give NSWindow a shake effect as saying NO, as in Login failure window
本文介绍了如何给NSWindow一个摇动的效果,如NO,如在登录失败窗口的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我使用下面的代码来动摇视图,它工作正常,现在我想摇一个窗口我改变两行,我粗糙的代码code2,但不工作
I use below code for shake a view and it works properly,now i want to shake a window i change two line that i bolded in code with code2 but doesn't work
//-------- code 1
CGFloat DegreesToRadians(CGFloat degrees)
{
return degrees * M_PI / 180;
}
NSNumber* DegreesToNumber(CGFloat degrees)
{
return [NSNumber numberWithFloat:
DegreesToRadians(degrees)];
}
---------------
[self.view setWantsLayer:YES];
CAKeyframeAnimation * animation= [CAKeyframeAnimation animationWithKeyPath:@"transform.rotation.z"];
[animation setDuration:0.04];
[animation setRepeatCount:10];
srand([[NSDate date] timeIntervalSince1970]);
float rand = (float)random();
[animation setBeginTime:CACurrentMediaTime() + rand * .0000000001];
NSMutableArray *values = [NSMutableArray array];
[values addObject:DegreesToNumber(-1)];
[values addObject:DegreesToNumber(1)];
[values addObject:DegreesToNumber(-1)];
[animation setValues:values];
[self.view.layer addAnimation:animation forKey:@"rotate"];
//-------- code 2
[self.window.animator addAnimation:animation forKey:@"rotate"];
[self.window.animator setWantsLayer:YES];
推荐答案
您需要添加 QuartzCore Framework
。
然后使用以下命令:
#import <Quartz/Quartz.h>
//below action calls the method `shakeWindow`
- (IBAction)shake:(id)sender {
[self shakeWindow];
}
-(void)shakeWindow{
static int numberOfShakes = 3;
static float durationOfShake = 0.5f;
static float vigourOfShake = 0.05f;
CGRect frame=[self.window frame];
CAKeyframeAnimation *shakeAnimation = [CAKeyframeAnimation animation];
CGMutablePathRef shakePath = CGPathCreateMutable();
CGPathMoveToPoint(shakePath, NULL, NSMinX(frame), NSMinY(frame));
for (NSInteger index = 0; index < numberOfShakes; index++){
CGPathAddLineToPoint(shakePath, NULL, NSMinX(frame) - frame.size.width * vigourOfShake, NSMinY(frame));
CGPathAddLineToPoint(shakePath, NULL, NSMinX(frame) + frame.size.width * vigourOfShake, NSMinY(frame));
}
CGPathCloseSubpath(shakePath);
shakeAnimation.path = shakePath;
shakeAnimation.duration = durationOfShake;
[self.window setAnimations:[NSDictionary dictionaryWithObject: shakeAnimation forKey:@"frameOrigin"]];
[[self.window animator] setFrameOrigin:[self.window frame].origin];
}
这篇关于如何给NSWindow一个摇动的效果,如NO,如在登录失败窗口的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文