5

我有一个包含很多内容的 UITextView。我有一个按钮,允许 UITextView 在 NSTimer 循环中自动滚动 + 10 像素:

scrollPoint = CGPointMake(scrollPoint.x, scrollPoint.y + 10);
[textView setContentOffset:scrollPoint animated:YES];   

这非常有效,因为动画使滚动相当流畅。我想允许用户通过用手指滚动来向前或向后跳过,但是由于滚动动画之后的这段代码,滚动会回到自动滚动的位置。

我需要在手动滚动后重置 scrollPoint 变量,但我不知道该怎么做。我试过实现委托方法

- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView;

但是这个方法也会在我的自动滚动上触发。

有任何想法吗?

4

3 回答 3

12

你可以让它相对于它所在的位置移动:

scrollPoint = textView.contentOffset;
scrollPoint.y= scrollPoint.y+10;
[textView setContentOffset:scrollPoint animated:YES];
于 2009-07-06T20:30:35.030 回答
3

我想做和 Ben 一样的事情,但我发现动画在显示时间方面的成本太高,而且似乎违背了初衷。我玩弄了它,发现以下代码完全符合您的要求,并且根本不会使系统陷入困境。

设置

if (autoscrollTimer == nil) {
  autoscrollTimer = [NSTimer scheduledTimerWithTimeInterval:(35.0/1000.0)
                                                     target:self
                                                   selector:@selector(autoscrollTimerFired:) 
                                                   userInfo:nil 
                                                    repeats:YES];
}

关键在于关闭动画并以较小的增量移动偏移量。它似乎运行得更快,并且不会干扰手动滚动。

- (void)autoscrollTimerFired:(NSTimer*)timer {
   CGPoint scrollPoint = self.textView.contentOffset;
   scrollPoint = CGPointMake(scrollPoint.x, scrollPoint.y + 1);
   [self.textView setContentOffset:scrollPoint animated:NO];
}

我对objective-c和iphone开发还很陌生,所以如果有更多经验的人发现这种方法存在问题,我将不胜感激。

于 2010-07-12T20:49:31.910 回答
0

我认为通过有效地滚动内容的两种方式来对抗 API。

如果我理解正确,在您当前的设置中,您有一个触发动画的按钮。

当您以这种方式滚动时,会创建一个动画并在另一个线程上运行。在动画运行时,表示层正在发生变化。但是,在动画完成之前不会设置实际的内容偏移量。

这可以正常工作且透明,直到您尝试在同一属性已被动画化时对其进行动画处理。

通常,在这种情况下,您取消现有动画,将帧设置为表示层(当前屏幕位置),然后应用新动画。

但是,您使用的是 textView (setContentOffset:animated:) 的便捷方法。当你这样做时,你放弃了精细的动画控制,以换取更少的代码行。

我认为停止正在进行的滚动可能很难,或者使用更高级别的 API 是不可能的。这意味着要做你想做的事,你至少必须尝试一个 UIView 动画块,并且很可能实际上创建一个 CAAnimation。

更简单的解决方案是选择一种滚动 textView 的方法。HIG 倾向于在 iPhone 上使用直接操作。即使双向执行滚动很容易,我还是建议放弃按钮方法,而只使用您现在正在实现的直接操作。

于 2009-07-06T22:04:16.260 回答