内容偏移动画已损坏

时间:2014-03-05 14:30:31

标签: ios objective-c uiscrollview contentoffset animatewithduration

我有一个动画,当一个手势识别器(双击)触发时开始播放:

[UIView animateWithDuration:0.3 animations:^{
  _scrollView.contentOffset              = CGPointMake(x, y);
  _scrollViewContentView.frame           = someFrame;
  _scrollViewContentView.layer.transform = 
       CATransform3DMakeScale(1.f/_zoomScale, 1.f/_zoomScale, 1.f);            
}];

除了一种情况之外它工作得很好:如果在动画执行之前没有调用scrollViewWillBeginDecelerating委托方法(只是拖动我的滚动视图)。

我只调用scrollViewDidEndDragging方法。我可以等待20秒,然后播放动画。除了contentOffset之外,它会正常播放。

委托方法本身什么都不做,只是添加它们才能看出问题所在。

我不知道为什么。

编辑:这是我问题的video。第1阶段:减速滚动,第2阶段没有。看看最后的位置。阶段1是正确的但不是阶段

4 个答案:

答案 0 :(得分:1)

尝试:

[_scrollView setContentOffSet:CGPointMake(x, y) animated:YES];

在动画块之外。我不相信contentOffSet可以通过UIView的动画块进行动画制作。

编辑: 而不是:

_scrollview.contentOffSet = CGPointMake(x, y);

尝试:

_scrollview.bounds = CGRectMake(x, y, CGRectGetWidth(scrollview.bounds), CGRectGetHeight(scrollview.bounds));

答案 1 :(得分:0)

我怀疑此行中的x可能会导致您看到的效果:

_scrollView.contentOffset              = CGPointMake(x, y);

它的价值是什么?我认为您应该尝试通过CGPointMake(0,y)替换它,看看是否每次都会出现白边。

我的理由如下:

1)要创建不超出图像范围的弹跳效果(不显示白色背景),您必须设置_scrollView' s {{1小于实际图像大小。

2)为了允许一些滚动,您将contentSize.width设置为大于contentSize.width的宽度

3)您已将图片置于_scrollView相对于其_scrollView

的大小的中心位置

4)动画制作时,您可能正在设置具有预先计算的x坐标的帧以将图像定位在左侧大小上,因为没有contentSize只会将图像保留在中心(顺便说一下,为什么要使用{ {1}},什么时候可以改变框架中的大小?)

5)在视频中,第一次运行动画时,你有CATransform3DMakeScale的最大值(因为你向左拖动因此增加内容偏移量,滚动视图反弹回到它& #39; s最大内容偏移量不超出内容大小限制)

6)在视频中第二次运行动画时,CATransform3DMakeScale值较小,因为通过减小它向右拖动

7)动画完成后,滚动视图的内容大小仍相同,因此可用的滚动量相同。如果你有contentOffset.x的最大值,那么如果你的contentOffset.x值较小,那么图像会更左边的图像 - 图像将更多在右边

8)如果contentOffset.x中的x与动画之前的实际内容偏移相关,那么在第一种情况下图像在左侧显示更多而在第二种情况下在右侧显示更多是有意义的。 / p>

如果我正确这就是你可以解决的问题

a)如果您希望图像始终显示在特定的x位置,请确保在动画中设置常量contentOffset。

b)根据您要设置动画的contentOffset调整计算帧(contentOffset.x)原点的代码(现在看起来它只适用于最大contentOffset.x)。

c)如果在动画之后你不希望内容可滚动,请确保在动画块中设置_scrollView.contentOffset = CGPointMake(x, y);

答案 2 :(得分:-1)

也许尝试使用核心动画而不是UIView动画。如果你遇到麻烦的原因是因为所有动画都是从图层中删除的,但是如果它是由-[removeAnimationForKey:@"bounds"]引起的,那么这可能会成为赢家。

CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"bounds"];
animation.fromValue = [NSValue valueWithCGRect:_scrollView.layer.bounds];
animation.toValue = [NSValue valueWithCGRect:(CGRect){ .origin = CGPointMake(x,y), .size = scrollView.layer.bounds.size }];
[scrollView.layer addAnimation:animation forKey:@"myCustomScroll"];
scrollView.layer.bounds = (CGRect){ .origin = CGPointMake(x,y), .size = scrollView.layer.bounds.size };

P.S。我没有测试上面的代码,只是我的头脑,所以对任何愚蠢的错误道歉。

答案 3 :(得分:-1)

我不确定我是否完全理解你的问题(也许你可以试着解释一下你想在这个动画中完成什么?)。无论如何,也许尝试这个而不是使用setContentOffset

CGRect *rect = CGRectMake(x, y, 0, 0);
[_scrollView scrollRectToVisible:rect animated:YES];