Iphone 使用CoreAnimation设置UIScrollView的滚动动画

Iphone 使用CoreAnimation设置UIScrollView的滚动动画,iphone,ios,uiscrollview,core-animation,Iphone,Ios,Uiscrollview,Core Animation,对不起,有一个大问题,真正的问题在底部是粗体的,现在是一些解释 我正在我的项目中使用CoreAnimation为一些像这样移动的对象设置动画 CABasicAnimation *moveAnimation; moveAnimation=[CABasicAnimation animationWithKeyPath:@"position"]; moveAnimation.duration = 2.0; moveAnimation.repeatCount=1;

对不起,有一个大问题,真正的问题在底部是粗体的,现在是一些解释

我正在我的项目中使用CoreAnimation为一些像这样移动的对象设置动画

CABasicAnimation *moveAnimation;        
moveAnimation=[CABasicAnimation animationWithKeyPath:@"position"];      
moveAnimation.duration = 2.0;       
moveAnimation.repeatCount=1;        
moveAnimation.autoreverses=NO;  
moveAnimation.delegate = self;
moveAnimation.fromValue = [NSValue valueWithCGPoint:[crawler.layer position]];
moveAnimation.fillMode = kCAFillModeForwards;
moveAnimation.removedOnCompletion = NO;
CGPoint p;
moveAnimation.toValue = [NSValue valueWithCGPoint:CGPointMake(100, 100)];
[crawler.layer addAnimation:moveAnimation forKey:@"moveAnimation"];
现在我需要设置一些UIScrollView的滚动动画。我不能使用
setContentOffset:(CGPoint)contentOffset animated:(BOOL)animated
方法,因为它不能自定义动画持续时间

我可以这样做

CGContextRef context = UIGraphicsGetCurrentContext();
[UIView beginAnimations:nil context:context];
[UIView setAnimationCurve:UIViewAnimationCurveLinear];
[UIView setAnimationDuration:2];
[UIView setAnimationDelegate:self];
scrollView.contentOffset = CGPointMake(scrollView.contentOffset.x + 200, scrollView.contentOffset.y);
[UIView commitAnimations];
但这不是CoreAnimation,我认为在一个应用程序中使用两种不同的动画技术不是一个好的做法

是否有一种方法可以使用CoreAnimation以自定义动画持续时间将UIScrollView内容滚动到自定义点?
顺便说一句,很抱歉英语不好。

我不认为你可以用CoreAnimation来制作这个点的动画

但是您可以尝试
setContentOffset:animated:
这就是您正在搜索的方法

只能转换
UIView

  • 框架
  • 界限
  • 居中
  • 转化
  • 阿尔法
  • 背景色
  • 内容延伸
有关动画签出的
CoreAnimation
的更多信息您可以使用:

[UIView animateWithDuration:duration animations:^ {
    [scrollView setContentOffset:destination animated:NO];
}];
可以这样设置动画的持续时间

[UIScrollViewNameHere setContentOffset:CGPointMake(x value of where you want to move to, y value of where you want to move to) animated:YES];
例如:

UIScrollView *scroll = [[UIScrollView alloc] initWithFrame:CGRectMake(4, 2, 2341, 412)];
[scroll setContentOffset:CGPointMake(320, 0) animated:YES];

您应该阅读有关可设置动画的属性

事实上,当您尝试设置层动画时,Apple会提供一组可设置动画的属性,但您不限于此。你可以随心所欲地制作动画

在所有情况下,都不应使用
kCAFillModeForwards
,因为它将要求设备永远重新绘制用于动画的最后一个表示层,而不是使用该层的缓存表示

因此,实现这一目标的方法是定义一个特定的层,其中
contentOffset
属性被定义为可设置动画。为了工作,您应该首先验证scrollview使用的是哪种顶层类,这样,通过对它进行子类化并将想要的属性(
contentOffset
)设置为动画,以及通过将该层设置为scrollview的顶层来对scrollview进行子类化,你有可能实现你想要做的事情

这是理论

但这就是我要尝试的。 查找此方法及其行为和意图

+ (BOOL)needsDisplayForKey:(NSString *)key

你能读到的另一件事是这个。但这也意味着您应该自己重新绘制uiscrollview

谢谢您的回答,但是setContentOffset:animated:method在我的情况下不适用,因为我需要设置动画持续时间。你的链接不是用于CoreAnimation)这是关于它的文档。是的,我可以,但这是块动画,不是CoreAnimation,不是吗?我需要一种使用CoreAnimation的方法,因为我已经在项目中使用了CoreAnimation,不想使用两种不同的技术。对于问题的持续时间部分,答案非常简单。“块动画”只是围绕核心动画的包装,而不是一种不同的技术。我不能使用setContentOffset:(CGPoint)contentOffset animated:(BOOL)animated方法,因为它不能自定义动画持续时间。我写的有问题,仔细阅读。非常感谢。这就是我现在需要做的。