2009-11-11 5 views
6

Я пытаюсь вибрировать/встряхивать элемент пользовательского интерфейса, а именно элемент управления, как если бы он был поражен, и резонирует. Я могу использовать Core Animation, чтобы встряхнуть его вертикально, горизонтально или в обоих, на один пиксель:Лучший способ вибрировать элемент пользовательского интерфейса?

CABasicAnimation* rotationXAnimation; 
rotationXAnimation = [CABasicAnimation animationWithKeyPath:@"position.y"]; 
rotationXAnimation.fromValue = [NSNumber numberWithFloat: ((UIControl *) sender).center.y-1.0 ]; 
rotationXAnimation.toValue = [NSNumber numberWithFloat: ((UIControl *) sender).center.y+1.0 ]; 
rotationXAnimation.duration = 0.2; 
rotationXAnimation.cumulative = NO; 
rotationXAnimation.repeatCount = 10.0; 
rotationXAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut]; 

[((UIControl *) sender).layer addAnimation:rotationXAnimation forKey:@"upDownAnimation"]; 

Или может вращаться по небольшой дуге вперед и назад вокруг оси Z (-M_PI * 0,02 и M_PI * 0,02) :

CABasicAnimation* rotationAnimation; 
rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"]; 
rotationAnimation.fromValue = [NSNumber numberWithFloat: -M_PI * 0.02 ]; 
rotationAnimation.toValue = [NSNumber numberWithFloat: M_PI * 0.02 ]; 
rotationAnimation.duration = 0.2; 
rotationAnimation.cumulative = NO; 
rotationAnimation.repeatCount = 10.0; 
rotationAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut]; 

[((UIControl *) sender).layer addAnimation:rotationAnimation forKey:@"rotationAnimation"]; 

Ни один из них не выглядит таким приятным. У кого-нибудь есть хорошие альтернативы? Я бы особенно хотел, чтобы классные идеи KeyPaths пытались попробовать.

Спасибо!

Update:

Ниже, где я договаривающиеся и расширение контроля, тем лучше, но я до сих пор ищу другие идеи.

CABasicAnimation* scaleAnimation; 
scaleAnimation = [CABasicAnimation animationWithKeyPath:@"transform.scale"]; 
scaleAnimation.fromValue = [NSNumber numberWithFloat: 0.95 ]; 
scaleAnimation.toValue = [NSNumber numberWithFloat: +1.05 ]; 
scaleAnimation.duration = 0.1; 
scaleAnimation.cumulative = NO; 
scaleAnimation.repeatCount = 10.0; 
scaleAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut]; 

[((UIControl *) sender).layer addAnimation:scaleAnimation forKey:@"scaleAnimation"]; 

ответ

6

Я дрожу один из моего ввода-Views после неправильного ввода данных пользователя с помощью:

- (void)earthquake:(UIView*)itemView 
{ 
    CGFloat t = 2.0; 
    CGAffineTransform leftQuake = CGAffineTransformTranslate(CGAffineTransformIdentity, t, -t); 
    CGAffineTransform rightQuake = CGAffineTransformTranslate(CGAffineTransformIdentity, -t, t); 

    itemView.transform = leftQuake; // starting point 

    [UIView beginAnimations:@"earthquake" context:itemView]; 
    [UIView setAnimationRepeatAutoreverses:YES]; // important 
    [UIView setAnimationRepeatCount:4]; 
    [UIView setAnimationDuration:0.07]; 
    [UIView setAnimationDelegate:self]; 
    [UIView setAnimationDidStopSelector:@selector(earthquakeEnded:finished:context:)]; 

    itemView.transform = rightQuake; // end here & auto-reverse 

    [UIView commitAnimations]; 
} 

- (void)earthquakeEnded:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context 
{ 
    if ([finished boolValue]) 
    { 
     UIView* item = (UIView *)context; 
     item.transform = CGAffineTransformIdentity; 
    } 
} 

Это выглядит вполне естественно, я получил этот код из некоторых интернет-нити, что Я не помню.

4

Вы можете использовать анимацию ключевого кадра в позиции слоя. Это субъективно, конечно, потому что я не уверен, что вы считаете «приятным». Анимация встряски, которую вы получаете, когда неправильно вводите свой пароль OS X, я дублировал с помощью Core Animation в этом blog post on Cocoa Is My Girlfriend. Не уверен, что это то, что вы собираетесь делать, но это одна из альтернатив.

С наилучшими пожеланиями,

+0

Это только в одно направление - бок о бок - право? – mahboudz

+0

Да. Но вы можете создать анимацию ключевого кадра, которая использует путь таким же образом, анимируя поле «позиция», которое является CGPoint. –

2

обновление Bersaelor's миленького сотрясение ответа здесь, чтобы использовать UIView блок анимацию вместо этого, некоторые люди не всегда знаете, что вы можете использовать автоматический реверс и повторить-счетчик в них:

self.transform = CGAffineTransformMakeTranslation(2.0, -2.0); 
[UIView animateWithDuration:0.07 
         delay:0.0 
        options:UIViewAnimationOptionAutoreverse 
       animations:^{ 
        UIView.animationRepeatCount = 4; 
        self.transform = CGAffineTransformMakeTranslation(-2.0, 2.0); 
       } 
       completion:^(BOOL finished){ 
        self.transform = CGAffineTransformIdentity; 
       }]; 
Смежные вопросы