UIView Animaton Сбрасывает к началу - PullRequest
1 голос
/ 20 октября 2010

Я пытаюсь запустить анимацию, чтобы смещение содержимого прокрутки непрерывно прокручивалось вниз.

Однако после каждого повтора он будет анимироваться из исходной позиции и не будет прогрессировать.

[UIView beginAnimations:nil context:NULL];
[UIView setAnimationBeginsFromCurrentState: YES];
[UIView setAnimationDuration:1.0];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
[UIView setAnimationRepeatCount: 100];

CGPoint contentOffset = scrollView.contentOffset;
contentOffset.y += 50;
scrollView.contentOffset = contentOffset;

scrollView.transform = CGAffineTransformIdentity;  
[UIView commitAnimations];

есть идеи?

1 Ответ

1 голос
/ 20 октября 2010

Почему вы пытаетесь вручную прокрутить представление? Не можете ли вы использовать метод

- (void)setContentOffset:(CGPoint)contentOffset animated:(BOOL)animated

Несмотря на это, я полагаю, что причина, по которой ваша анимация не работает так, как вы ожидаете, заключается в том, что вы устанавливаете счетчик повторений вместо фактического повторного рендеринга анимации каждый раз. Если вы хотите обойти эту проблему, вы можете снова анимировать в обратном вызове анимации, создав метод, оборачивающий анимацию и передающий параметры через указатель контекста.

- (void) animateContentOffsetByAmount:(CGFloat)amount numberRemaining:(int)num {
    if (num == 0) return;

    [UIView setAnimationDelegate:self];
    [UIView setAnimationDidStopSelector:
        @selector(scrollAnimationStoppedWithID:finished:context:)];

    //NSArray released in callback
    NSArray* contextArray = [NSArray arrayWithObjects:
      [NSNumber numberWithFloat:amount],
      [NSNumber numberwithInt:num], nil]
    [UIView beginAnimations:nil context:contextArray];
    [UIView setAnimationBeginsFromCurrentState: YES];
    [UIView setAnimationDuration:1.0];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];

    CGPoint contentOffset = scrollView.contentOffset;
    contentOffset.y += amount;
    scrollView.contentOffset = contentOffset;

    scrollView.transform = CGAffineTransformIdentity;  
    [UIView commitAnimations];
}

- (void) scrollAnimationStoppedWithID:(NSString*)id
        finished:(NSNumber*)finished context:(void*)context {
    NSArray* contextArray = (NSArray*)context;
    CGFloat amount = [(NSNumber*)[contextArray objectAtIndex:0] floatValue];
    int count = [(NSNumber*)[contextArray objectAtIndex:1] intValue];
    count = count - 1;
    [contextArray release];
    [self animateContentOffsetByAmount:amount numberRemaining:count]
}

Тогда в своем коде просто позвоните

[self animateContentOffsetByAmount:50 numberRemaining:100];
...