Как создать эффект качающегося значка iPhone? - PullRequest
52 голосов
/ 30 мая 2009

Я хочу качать изображение назад и вперед в моем приложении, подобно тому, как значки iPhone качаются при нажатии на него. Какой лучший способ сделать это?

Это мой первый набег в анимации, в котором не используется анимированный GIF. Я думаю, что идея состоит в том, чтобы слегка повернуть изображение назад и вперед, чтобы создать эффект колебания. Я смотрел на использование CABasicAnimation и CAKeyframeAnimation. CABasicAnimation создает джиттер каждый раз, когда повторяется, потому что он переходит в исходную позицию и не интерполирует обратно. CAKeyframeAnimation кажется решением, за исключением того, что я не могу заставить его работать. Я должен что-то упустить. Вот мой код с использованием CAKeyframeAnimation (который не работает):

    NSString *keypath = @"wobbleImage";
CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:keypath];
animation.duration = 1.0f;
animation.delegate = self;
animation.repeatCount = 5;

CGFloat wobbleAngle = 0.0872664626f;
NSValue *initial = [NSValue valueWithCATransform3D:CATransform3DMakeRotation(0.0f, 0.0f, 0.0f, 1.0f)];
NSValue *middle = [NSValue valueWithCATransform3D:CATransform3DMakeRotation(wobbleAngle, 0.0f, 0.0f, 1.0f)];
NSValue *final = [NSValue valueWithCATransform3D:CATransform3DMakeRotation(-wobbleAngle, 0.0f, 0.0f, 1.0f)];
animation.values = [NSArray arrayWithObjects:initial, middle, final, nil];

[imageView.layer addAnimation:animation forKey:keypath];


Или может быть более простое решение, которое я просто пропускаю. Цените любые указатели. Спасибо!

Ответы [ 12 ]

0 голосов
/ 30 июля 2017

Swift 3

func startWiggling() {
    deleteButton.isHidden = false
    guard contentView.layer.animation(forKey: "wiggle") == nil else { return }
    guard contentView.layer.animation(forKey: "bounce") == nil else { return }

    let angle = 0.04

    let wiggle = CAKeyframeAnimation(keyPath: "transform.rotation.z")
    wiggle.values = [-angle, angle]
    wiggle.autoreverses = true
    wiggle.duration = randomInterval(0.1, variance: 0.025)
    wiggle.repeatCount = Float.infinity
    contentView.layer.add(wiggle, forKey: "wiggle")

    let bounce = CAKeyframeAnimation(keyPath: "transform.translation.y")
    bounce.values = [4.0, 0.0]
    bounce.autoreverses = true
    bounce.duration = randomInterval(0.12, variance: 0.025)
    bounce.repeatCount = Float.infinity
    contentView.layer.add(bounce, forKey: "bounce")
}

func stopWiggling() {
    deleteButton.isHidden = true
    contentView.layer.removeAllAnimations()
}
0 голосов
/ 20 ноября 2010

Хорошо, код, заданный Ramin , работает хорошо. Но если вы используете приложение с вкладками и переходите к следующему элементу вкладки, а затем снова возвращаетесь к предыдущему элементу вкладки, вы увидите, что ваше представление было перемещено влево каждый раз. Поэтому рекомендуется использовать метод ViewWillAppear как.

- (void)viewWillAppear:(BOOL)animated
{
    UIView* item = self.view;
    item.transform = CGAffineTransformIdentity;
}

, поэтому при каждой загрузке представления вы найдете анимацию в нужном месте. И также используйте этот метод.

[UIView setAnimationDidStopSelector:@selector(myMethod:finished:context:)];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...