Почему вы пытаетесь вручную прокрутить представление? Не можете ли вы использовать метод
- (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];