iPhone自动滚动UITextView,但也允许手动滚动

时间:2009-07-06 20:05:05

标签: iphone iphone-sdk-3.0 uiscrollview uitextview

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

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

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

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

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

但是这个方法也会激活我的自动滚动。

有什么想法吗?

3 个答案:

答案 0 :(得分:12)

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

scrollPoint = textView.contentOffset;
scrollPoint.y= scrollPoint.y+10;
[textView setContentOffset:scrollPoint animated:YES];

答案 1 :(得分: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开发很新,所以如果有经验的人发现这种方法存在问题,我将不胜感激。

答案 2 :(得分:0)

我认为通过有效的2种方式来滚动内容,你可以打击API。

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

以这种方式滚动时,会创建一个动画并在另一个线程上运行。动画正在运行时,表示层正在更改。但是,在动画完成之前,实际内容偏移量设置为 NOT

这很好,透明,直到你试图在动画中为同一属性设置动画。

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

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

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

更简单的解决方案是采用一种滚动textView的方法。 HIG倾向于在iPhone上使用直接操作。即使很容易双向执行滚动,我也建议抛弃按钮方法,然后使用你正在实现的直接操作。