2012-04-07 39 views

cevap

13

kullanımı, kullanıcı yanlış şifre Ben bloklar için çıldırıyorum

static int numberOfShakes = 8; 
    static float durationOfShake = 0.5f; 
    static float vigourOfShake = 0.05f; 

    CGRect frame=[self.view.window 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.view.window setAnimations:[NSDictionary dictionaryWithObject: shakeAnimation forKey:@"frameOrigin"]]; 
    [[self.view.window animator] setFrameOrigin:[self.view.window frame].origin]; 
+0

yukarıdaki görünümü kullanır, [burada] (http://stackoverflow.com/questions/10517386/how-to-shake-nswindow/23491643#23491643) pencereyi sallar. * Büyük bir değişiklik değil, sadece kolay referans içindir * –

2

girdiğinizde. İşte bir blok versiyonu Burada

- (void)shakeView:(UIView *)view times:(NSInteger)times completion:(void (^)(BOOL finished))completion { 

    if (times <= 0) { 
     completion(YES); 
    } else { 
     UIViewAnimationOptions options = UIViewAnimationOptionBeginFromCurrentState; 
     [UIView animateWithDuration:0.1 delay: 0.0 options: options 
         animations:^{ 
          view.frame = CGRectOffset(view.frame, 6.0, 0.0); // shake to 
         } 
         completion:^(BOOL finished){ 
          [UIView animateWithDuration:0.1 delay: 0.0 options:options 
               animations:^{ 
                view.frame = CGRectOffset(view.frame, -6.0, 0.0); // shake fro 
               } 
               completion:^(BOOL finished) { 
                [self shakeView:view times:times-1 completion:completion]; 
               }]; 
         }]; 
    } 
} 
+0

Bu, OS X – sbooth

+0

nolu bilgisayarda çalışmayacaktır. benim hatam. Doğru prosedür nedir? silin? – danh

+0

Bence önemli değil. – sbooth

4

... de bu işe gerektiğini bulunuyor Swift SajjadZare cevabı @ geçerli:

Swift 2.0:

 let numberOfShakes:Int = 8 
     let durationOfShake:Float = 0.5 
     let vigourOfShake:Float = 0.05 

     let frame:CGRect = (self.view.window?.frame)! 
     let shakeAnimation = CAKeyframeAnimation() 

     let shakePath = CGPathCreateMutable() 
     CGPathMoveToPoint(shakePath, nil, NSMinX(frame), NSMinY(frame)) 

     for _ in 1...numberOfShakes { 
      CGPathAddLineToPoint(shakePath, nil, NSMinX(frame) - frame.size.width * CGFloat(vigourOfShake), NSMinY(frame)) 
      CGPathAddLineToPoint(shakePath, nil, NSMinX(frame) + frame.size.width * CGFloat(vigourOfShake), NSMinY(frame)) 
     } 

     CGPathCloseSubpath(shakePath) 
     shakeAnimation.path = shakePath 
     shakeAnimation.duration = CFTimeInterval(durationOfShake) 
     self.view.window?.animations = ["frameOrigin":shakeAnimation] 
     self.view.window?.animator().setFrameOrigin(self.view.window!.frame.origin) 

Swift 3.0:

let numberOfShakes:Int = 8 
    let durationOfShake:Float = 0.5 
    let vigourOfShake:Float = 0.05 

    let frame:CGRect = (self.view.window!.frame) 
    let shakeAnimation = CAKeyframeAnimation() 

    let shakePath = CGMutablePath() 
    shakePath.move(to: CGPoint(x: NSMinX(frame), y: NSMinY(frame))) 

    for _ in 1...numberOfShakes { 
     shakePath.addLine(to: CGPoint(x:NSMinX(frame) - frame.size.width * CGFloat(vigourOfShake), y: NSMinY(frame))) 
     shakePath.addLine(to: CGPoint(x:NSMinX(frame) + frame.size.width * CGFloat(vigourOfShake), y: NSMinY(frame))) 
    } 

    shakePath.closeSubpath() 
    shakeAnimation.path = shakePath 
    shakeAnimation.duration = CFTimeInterval(durationOfShake) 
    self.view.window?.animations = ["frameOrigin":shakeAnimation] 
    self.view.window?.animator().setFrameOrigin((self.view.window?.frame.origin)!) 
+0

hızlı 3.0 belki? – dylan

+0

@dylan Güncellendi. – iwatakeshi

+0

bu, görünüm denetleyicisine veya pencere denetleyicisine gider (eğer varsa) – dylan

0

Yaptığım yol budur:

-(void)shakeLayer:(CALayer*)layer{ 
    int repeats = 4; 
    float time = 0.04; 
    float movement = 5; 
    for(int x = 0; x < repeats; x++){ 
     dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(x*(time*4) * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 
      CABasicAnimation *posAnimation = [CABasicAnimation animationWithKeyPath:@"transform.translation.x"]; 
      [posAnimation setFromValue:[NSNumber numberWithFloat:0]]; 
      [posAnimation setToValue:[NSNumber numberWithFloat:movement]]; 
      [posAnimation setBeginTime:0.0]; 
      [posAnimation setDuration:time]; 

      CABasicAnimation *negAnimation = [CABasicAnimation animationWithKeyPath:@"transform.translation.x"]; 
      [negAnimation setFromValue:[NSNumber numberWithFloat:movement]]; 
      [negAnimation setToValue:[NSNumber numberWithFloat:-movement]]; 
      [negAnimation setBeginTime:time]; 
      [negAnimation setDuration:time*2]; 

      CABasicAnimation *posAnimation2 = [CABasicAnimation animationWithKeyPath:@"transform.translation.x"]; 
      [posAnimation2 setFromValue:[NSNumber numberWithFloat:-movement]]; 
      [posAnimation2 setToValue:[NSNumber numberWithFloat:0]]; 
      [posAnimation2 setBeginTime:time*3]; 
      [posAnimation2 setDuration:time]; 

      CAAnimationGroup *group = [CAAnimationGroup animation]; 
      [group setDuration:time*4]; 
      [group setAnimations:[NSArray arrayWithObjects:posAnimation, negAnimation, posAnimation2, nil]]; 

      [layer addAnimation:group forKey:nil]; 
     }); 
    } 
}