MAC開發(fā)--仿QQ窗口抖屏效果

01 窗口抖動

創(chuàng)建一個NSWindow的分類,我取名為NSWindow+Animation

自定義抖屏方法,實現(xiàn)beginShakeAnimation方法,如下截圖所示:

窗口抖屏方法

為了方便大家取用,摘抄代碼復(fù)制如下:

static NSInteger const numberOfShakes = 20;

static float const durationOfShake = 0.5f;

static float const vigourOfShake = 0.01f;

- (void)beginShakeAnimation

{

CGRect frame = self.frame;

CAKeyframeAnimation *shakeAnimation = [CAKeyframeAnimation animation];

CGMutablePathRef shakePath = CGPathCreateMutable();

CGPathMoveToPoint(shakePath, NULL, NSMinX(frame), NSMinY(frame));

int index;

for (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 setAnimations:@{@"frameOrigin" : shakeAnimation}];

[[self animator] setFrameOrigin:self.frame.origin];

}

02 視圖抖動

如果你的需求不是整個窗口抖動,而是某個視圖抖動,就需要用layer的關(guān)鍵幀動畫來實現(xiàn)。

創(chuàng)建一個NSView的分類,我取名為NSView+Animation

自定義抖屏方法,實現(xiàn)beginShakeAnimation方法,如下截圖所示:

? ??
視圖抖屏效果

為了方便大家取用,摘抄代碼復(fù)制如下:

//角度轉(zhuǎn)化為弧度

#define kToRadian(x) (M_PI/180 * (x))

- (void)beginShakeAnimation

{

//視圖抖動

CAKeyframeAnimation *keyframeAni = [CAKeyframeAnimation animationWithKeyPath:@"transform.rotation.z"];

keyframeAni.duration = 0.2;

//關(guān)鍵部分角度

keyframeAni.values = @[@(kToRadian(5)),@(kToRadian(0)),@(kToRadian(-5)),@(kToRadian(0)),@(kToRadian(5))];

keyframeAni.repeatCount = 5;

NSRect viewRect = self.frame;

CGFloat posX = NSMinX(viewRect) + NSWidth(viewRect) * 0.5;

CGFloat posY = NSMinY(viewRect) + NSHeight(viewRect) * 0.5;

self.layer.position = CGPointMake(posX, posY);

self.layer.anchorPoint = CGPointMake(0.5, 0.5);

[self.layer addAnimation:keyframeAni forKey:@"key"];

}

需要注意的是:mac應(yīng)用的關(guān)鍵幀動畫圓點是視圖原點,ios的圓點視圖是中心,所以mac需要修改一下position和anchorPoint。

總結(jié):如果是窗口抖動,使用NSWindow的setAnimations方法;如果是視圖抖動,使用NSView.layer的關(guān)鍵幀動畫。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容