6

我有一个动画,它在手势识别器(双击)触发时启动:

[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.

委托方法本身什么都不做,它们只是被添加来查看问题可能出在哪里。

我不知道为什么。

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

4

4 回答 4

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));
于 2014-03-08T08:30:32.663 回答
0

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

_scrollView.contentOffset              = CGPointMake(x, y);

它有什么价值?我认为您应该尝试用 CGPointMake(0, y) 替换它,看看这是否会导致每次出现白边。

我的理由如下:

_scrollView1)要创建不超出图像范围的弹跳效果(不显示白色背景),您必须设置contentSize.width小于实际图像大小。

2)允许一些滚动你设置了contentSize.width大于宽度_scrollView

_scrollView3)您已将图像相对于它的大小居中contentSize

4)动画时,您可能正在使用预先计算的 x 坐标设置框架以将图像定位在左侧尺寸上,因为没有它只CATransform3DMakeScale会将图像留在中心(顺便说一下,为什么使用CATransform3DMakeScale,当您可以更改尺寸时框架?)

5)在视频中,第一次运行动画时,您必须contentOffset.x达到它的最大值(因为您向左拖动,因此增加了内容偏移量,并且滚动视图反弹回不超过内容大小限制的最大内容偏移量)

6)在第二次运行动画时的视频中,你有contentOffset.x一个较小的值,因为你通过减少它向右拖动

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

8) 如果 x in_scrollView.contentOffset = CGPointMake(x, y);与动画之前的实际内容偏移有关,那么在第一种情况下图像更多出现在左侧,而在第二种情况下更多出现在右侧,这是有道理的。

如果我是对的,那么这就是您可以解决的方法

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

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

c) 如果在动画之后您不希望内容可滚动,请确保_scrollView.contentSize = _scrollview.bounds.size;在动画块中进行设置。

于 2014-03-14T13:08:01.833 回答
-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 };

PS我还没有测试上面的代码,这只是我的想法,所以对任何愚蠢的错误表示歉意。

于 2014-03-10T06:42:40.467 回答
-1

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

CGRect *rect = CGRectMake(x, y, 0, 0);
[_scrollView scrollRectToVisible:rect animated:YES];
于 2014-03-10T06:51:42.677 回答