当用户手动滚动浏览我的UIScrollView时,我的委托的scrollViewDidScroll方法会在动画期间重复调用,并使用contentOffset的新更新值。 当我调用“[scrollView setContentOffset:320 animated:YES”时,则以相同的方式调用委托方法。 我认为正常的滚动速度对于用户体验来说太快了,所以在“animatedWithDuration:”块中包含了一个“[scrollView setContentOffset:320]”,就像Apple在UIView类引用中推荐的那样。
但是......现在我的scrollViewDidScroll方法只在动画开始时使用最终值调用一次,而不再在动画期间调用。当我使用旧的“beginAnimations:”方法时,我得到相同的效果。
所以......有人知道如何解决这个问题吗?
顺便说一下,UIScrollView的“setContentOffset”方法显示了相同的行为。它曾经在动画中被调用,现在只被调用一次。
答案 0 :(得分:6)
感谢Fichek的暗示,我已经让这个工作了。就像Fichek说的那样,在动画过程中你不会收到任何已更改属性的通知。所以诀窍是,确保依赖于已更改属性的任何内容同时也是动画。您需要在与原始属性相同的块中设置其动画。 如果你然后在动画上设置“UIViewAnimationOptionAllowUserInteraction”,那么相同属性的任何正在进行的用户交互仍然可以工作 - 而且令人惊讶的是,我不得不说。
对于我的具体案例 - 保持拖动的视图静止,而UIScrollView在下面滚动 - 这是我设置动画的方式:
[UIView animateWithDuration:0.5 delay:0
options:UIViewAnimationOptionAllowUserInteraction
animations:^{
[theScrollView setContentOffset:offset];
// compute newCenter from the new offset
theDraggedView.center = newCenter;
} completion:^(BOOL finished) {}];