Как приостановить и возобновить анимацию UIView? - PullRequest
4 голосов
/ 09 июля 2010

У меня есть UIView с несколькими UILabels, которые анимируются сверху вниз и наоборот. Это своего рода Autoque, скажем, :) Я использую 2 функции:

-(void)goUp 
-(void)goDown 

Эти функции запускают анимацию UIView в требуемую позицию. Обе они имеют AnimationDidStopSelector , определяющий другую функцию в конце. Это все работает гладко.

При касании экрана, используя touchesBegan, я хотел бы приостановить текущую анимацию и изменить вертикальное положение UIView с помощью события touchesMoved. В штрихах Закругление я хочу возобновить анимацию до требуемой конечной позиции.

Каков был бы правильный способ сделать это?

Thomas

Ответы [ 5 ]

7 голосов
/ 01 ноября 2014

Я создал категорию в UIView для приостановки и остановки анимации:

@interface UIView (AnimationsHandler)

- (void)pauseAnimations;
- (void)resumeAnimations;

@end

@implementation UIView (AnimationsHandler)
- (void)pauseAnimations
{
    CFTimeInterval paused_time = [self.layer convertTime:CACurrentMediaTime() fromLayer:nil];
    self.layer.speed = 0.0;
    self.layer.timeOffset = paused_time;
}

- (void)resumeAnimations
{
    CFTimeInterval paused_time = [self.layer timeOffset];
    self.layer.speed = 1.0f;
    self.layer.timeOffset = 0.0f;
    self.layer.beginTime = 0.0f;
    CFTimeInterval time_since_pause = [self.layer convertTime:CACurrentMediaTime() fromLayer:nil] - paused_time;
    self.layer.beginTime = time_since_pause;
}
4 голосов
/ 13 января 2011

На самом деле, вы все еще можете приостановить анимацию UIView, основываясь на ответе на вопрос, с которым связался Владимир, поскольку она приостанавливает мою CABasicAnimations, а также мою UIView анимацию после того, как я реализовал все свои анимации как CABasicaAnimations и затем добавил несколько UIView анимаций, которые, как я думал, не будут приостановлены, но они тоже не сработали. Это соответствующая ссылка .

Я хотел приостановить весь вид, поэтому передал self.view.layer в качестве слоя, который нужно приостановить. Но для тех, кто не знает о CALayer, передайте view.layer, который вы хотите приостановить. У каждого UIView есть CALayer, поэтому просто введите самый верхний view.layer, который важен для вас. В случае с Томасом, основываясь на вашем собственном ответе, может показаться, что вы захотите перейти в self.containerView.layer, чтобы сделать паузу.

Причина, по которой это работает, заключается в том, что UIView анимации - это просто слой поверх базовой анимации. По крайней мере, это мое понимание.

Надеюсь, это поможет будущим людям задуматься, как приостановить анимацию.

2 голосов
/ 09 июля 2010

Владимир, вопрос о CAAnimations имеет смысл ... но я нашел способ сделать "паузу", чтобы я мог продолжать использовать анимации UIView:

CALayer *pLayer = [self.containerView.layer presentationLayer];
CGRect frameStop = pLayer.frame;
pausedX = frameStop.origin.x;
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationBeginsFromCurrentState:YES];
[UIView setAnimationDuration:0.01];
[UIView setAnimationCurve: UIViewAnimationCurveLinear];     
// set view properties

frameStop.origin.x = pausedX;
self.containerView.frame = frameStop;
[UIView commitAnimations];

То, что я здесь делаю, - это использование presentationLayer, чтобы узнать текущее значение x анимированного представления. После этого я выполняю новую анимацию, которая перезаписывает оригинальную анимацию. Убедитесь, что для этого установлено значениеAnimationBeginsFromCurrentstate: YES. Это отменяет исходную анимацию и помещает анимированный вид не в конечную позицию (что происходит автоматически), а в текущую позицию процесса анимации.

Надеюсь, это поможет и другим! :)

1 голос
/ 09 июля 2010

Я не уверен, возможно ли это с помощью UIView напрямую, но вы определенно можете вместо этого делать CALayers этого анимирующего представления. См. этот вопрос о приостановке и возобновлении CAAnimations.

0 голосов
/ 12 июня 2014

Надеюсь, что это поможет вам.

- (void)goUP{
    CFTimeInterval pausedTime = [self.layer timeOffset];
    self.layer.speed = 1.0;
    self.layer.timeOffset = 0.0;
    self.layer.beginTime = 0.0;
    CFTimeInterval timeSincePause = [self.layer convertTime:CACurrentMediaTime() fromLayer:nil] - pausedTime;
    self.layer.beginTime = timeSincePause;
}

- (void)goDown{
    CFTimeInterval pausedTime = [self.layer convertTime:CACurrentMediaTime() fromLayer:nil];
    self.layer.speed = 0.0;
    self.layer.timeOffset = pausedTime;
}

Когда вы вызываете анимацию Layer, это повлияет на все дерево слоев и анимацию подрежимного слоя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...