在iPhone上摇晃视觉效果(不摇动设备)

Ste*_*her 44 iphone core-animation

在登录失败时,我宁愿避免显示警报,它太短暂了.显示警报然后在登录屏幕上的某处显示文本似乎是重复.

因此,当用户输入错误的用户ID和密码(如Mac登录屏幕)时,我希望以图形方式摇动我的登录视图.

任何人都知道是否有办法解决这个问题,或者对我可以使用的其他效果有任何建议吗?

nie*_*bot 97

我认为这是一个更有效的解决方案:

迅速:

let anim = CAKeyframeAnimation( keyPath:"transform" )
anim.values = [
    NSValue( CATransform3D:CATransform3DMakeTranslation(-5, 0, 0 ) ),
    NSValue( CATransform3D:CATransform3DMakeTranslation( 5, 0, 0 ) )
]
anim.autoreverses = true
anim.repeatCount = 2
anim.duration = 7/100

viewToShake.layer.addAnimation( anim, forKey:nil )
Run Code Online (Sandbox Code Playgroud)

OBJ-C:

CAKeyframeAnimation * anim = [ CAKeyframeAnimation animationWithKeyPath:@"transform" ] ;
anim.values = @[ 
    [ NSValue valueWithCATransform3D:CATransform3DMakeTranslation(-5.0f, 0.0f, 0.0f) ], 
    [ NSValue valueWithCATransform3D:CATransform3DMakeTranslation( 5.0f, 0.0f, 0.0f) ] 
] ;
anim.autoreverses = YES ;
anim.repeatCount = 2.0f ;
anim.duration = 0.07f ;

[ viewToShake.layer addAnimation:anim forKey:nil ] ;
Run Code Online (Sandbox Code Playgroud)

仅创建一个动画对象,并且全部在CoreAnimation级别执行.


Chr*_*les 59

使用基于iOS 4+块的UIKit动画(并且松散地基于jayccrown的答案):

- (void)shakeView:(UIView *)viewToShake
{
    CGFloat t = 2.0;
    CGAffineTransform translateRight  = CGAffineTransformTranslate(CGAffineTransformIdentity, t, 0.0);
    CGAffineTransform translateLeft = CGAffineTransformTranslate(CGAffineTransformIdentity, -t, 0.0);

    viewToShake.transform = translateLeft;

    [UIView animateWithDuration:0.07 delay:0.0 options:UIViewAnimationOptionAutoreverse|UIViewAnimationOptionRepeat animations:^{
        [UIView setAnimationRepeatCount:2.0];
        viewToShake.transform = translateRight;
    } completion:^(BOOL finished) {
        if (finished) {
            [UIView animateWithDuration:0.05 delay:0.0 options:UIViewAnimationOptionBeginFromCurrentState animations:^{
                viewToShake.transform = CGAffineTransformIdentity;
            } completion:NULL];
        }
    }];
}
Run Code Online (Sandbox Code Playgroud)

  • 这应该是问题的最佳答案,因为在启用ARC的情况下,上述所有答案都无法正常工作(无需修改或省略视图参数).使用块! (4认同)
  • 你可以这样做只需一个自动反转动画 - 不需要完成块.(我在下面发布了代码) (2认同)

jay*_*own 40

我曾经看过一些摆动动画并改变它以摆动视图t像素直立和向下:

- (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:5];
    [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;
    }
}
Run Code Online (Sandbox Code Playgroud)


Jus*_*her 8

这是一个教程,详细介绍了如何在Cocoa中完成它.对于iPhone应该是相同的(或至少非常相似).

http://www.cimgf.com/2008/02/27/core-animation-tutorial-window-shake-effect/


slf*_*slf 6

只需更改视图中心属性的X坐标即可.如果你还没有完成任何核心动画,那么它很简单.

首先,启动一个动画,然后听它完成,然后再向左移动,依此类推.缩短时间以使其"感觉正确"可能需要一段时间.

- (void)animationFinishCallback:(NSString *)animationID finished:(BOOL)finished context:(void *)context
{
  if ([animationID isEqualToString:@"MoveRight"]) {
    [UIView beginAnimations:@"MoveLeft" context:NULL];
    [UIView setAnimationDuration:1.0];
    [UIView setAnimationDelay: UIViewAnimationCurveEaseIn];
    [UIView setAnimationDelegate:self];
    [UIView setAnimationDidStopSelector:@selector(animationFinishCallback:finished:context:)];

    myView.center = CGRectMake(newX, newY);
    [UIView commitAnimations];
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 您还可以创建动画并将其应用于视图的"CALayer".这将允许您使用例如"CAKeyframeAnimation",它可以让您微调动画.对于像这样的动画,你可能需要这种灵活性. (4认同)