我有一个包含大量内容的UITextView。我有一个按钮,允许UITextView在NSTimer循环中自动滚动+10像素:
scrollPoint = CGPointMake(scrollPoint.x, scrollPoint.y + 10);
[textView setContentOffset:scrollPoint animated:YES];
这非常有效,因为动画使滚动相当平滑。我希望允许用户通过用手指滚动来向前或向后跳过,但是由于滚动动画后的这段代码,滚动会快速回到自动滚动的位置。
我需要在手动滚动后重置scrollPoint变量,但我不知道该怎么做。我已经尝试过实现委托方法
- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView;
但是这个方法也会激活我的自动滚动。
有什么想法吗?
答案 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上使用直接操作。即使很容易双向执行滚动,我也建议抛弃按钮方法,然后使用你正在实现的直接操作。