Подтвердить что ты не робот

Кривые анимации iOS UIView

Есть ли способ сделать что-то "коротким и легким" способом, как показано ниже? Кривая по-прежнему использует EaseOut.

[UIView setAnimationCurve:UIViewAnimationCurveEaseIn];
[UIView animateWithDuration:0.5 animations:^{
    // ... do stuff here
}];
4b9b3361

Ответ 1

Вы смешиваете два разных вида анимации UIView. Вы должны использовать что-то вроде этого:

[UIView animateWithDuration:0.5
                      delay:0.0
                    options:UIViewAnimationOptionCurveEaseIn
                 animations:^{
                    // ... do stuff here
               } completion:NULL];

Это произошло благодаря новому API-интерфейсу UIView-анимации на основе блоков. С другой стороны, первая строка является частью более старого API анимации UIView, который выглядит следующим образом:

[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.5];
[UIView setAnimationCurve:UIViewAnimationCurveEaseIn];
// ... do stuff here
[UIView commitAnimations];

Они делают то же самое, и вы можете использовать их (хотя Apple рекомендует использовать API на основе блоков, поскольку после завершения анимации проще/чище делать обратные вызовы).

Ответ 2

Вы можете сделать это, используя Core Animation, CAKeyFrameAnimation, чтобы определить точки кривой. См. Этот учебник: http://nachbaur.com/blog/core-animation-part-4

Ответ 3

Возьмем точки кривой p1, p2, p3, p4 и p5 и найдите среднюю точку для каждой пары соседних точек. Метка m1 как средняя точка для p1 и p2. Аналогично для m2, m3, m4.

  • Добавить квадрантную кривую в точку m2 с p2 в качестве контрольной точки.
  • Добавить квадрантную кривую в точку m3 с p3 в качестве контрольной точки.
  • Добавить квадрантную кривую в точку m4 с p4 в качестве контрольной точки.

Код:

CGFloat screenHeight = self.view.frame.size.height;
CGFloat screenWidth = self.view.frame.size.width;

UIView *aniView = [[UIView alloc] initWithFrame:CGRectMake(50, screenHeight, 50, 50)];
[aniView setBackgroundColor:[UIColor redColor]];
aniView.layer.cornerRadius = 25.0;
[self.view addSubview:aniView];


UIBezierPath *movePath = [UIBezierPath bezierPath];
[movePath moveToPoint:aniView.center];
[movePath addQuadCurveToPoint:CGPointMake(screenWidth-50,screenHeight-50)
                 controlPoint:CGPointMake(screenWidth/2,screenHeight-150)];
CAKeyframeAnimation *moveAnim = [CAKeyframeAnimation animationWithKeyPath:@"position"];
moveAnim.path = movePath.CGPath;
moveAnim.removedOnCompletion = YES;
CAAnimationGroup *animGroup = [CAAnimationGroup animation];
animGroup.animations = [NSArray arrayWithObjects:moveAnim,  nil];
animGroup.duration = 2.0;

[CATransaction begin]; {
    [CATransaction setCompletionBlock:^{
        [aniView.layer removeAllAnimations];
        [aniView removeFromSuperview];
    }];

    [aniView.layer addAnimation:animGroup forKey:nil];

} [CATransaction commit];

Скопируйте предыдущий код в некоторый метод и попробуйте вызвать метод...