2010-10-19 69 views
1

我试图运行一个动画,以便scrollview的contentoffset不断滚动下来。UIView Animaton重置为开始

但是,在每次重复之后,它将从原始位置开始动画并且不会进行。

[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

你为什么试图手动滚动视图?你不能用方法

- (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]; 
+0

原因,我想这样做,这种方式是模拟控制有点像老虎机..很像UIPickerView ..但因为我们无法在视图方面做太多的自定义,我这样做的滚动视图滚动数字。在最新版本的SDK中。根据视图不允许对UIPickerView进行更改。 – 2010-10-20 01:16:57

+0

虽然很棒,但我明白了。谢谢! – 2010-10-20 01:21:24