在UITextView iOS中平滑滚动文本(自动滚动)

在UITextView iOS中平滑滚动文本(自动滚动),ios,ipad,smooth-scrolling,Ios,Ipad,Smooth Scrolling,我正在一个项目中工作,我发现UItextview中有一些文本。该应用程序希望连续平滑滚动该文本,还希望管理其滚动速度。我的意思是这里的文字应该滚动顺利,应用程序包含滑块,我可以管理的速度。 下面是我正在使用的一些示例代码 - (void) autoscrollTimerFired:(NSTimer *)timer { [self.completeText setContentOffset:CGPointMake(0, self.completeText.contentOffset.y +

我正在一个项目中工作,我发现UItextview中有一些文本。该应用程序希望连续平滑滚动该文本,还希望管理其滚动速度。我的意思是这里的文字应该滚动顺利,应用程序包含滑块,我可以管理的速度。 下面是我正在使用的一些示例代码

- (void) autoscrollTimerFired:(NSTimer *)timer {
    [self.completeText setContentOffset:CGPointMake(0, self.completeText.contentOffset.y + 1.0) animated:NO];
    if (self.completeText.contentOffset.y != self.completeText.contentSize.height - self.completeText.frame.size.height) {
        scrollingTimer = [NSTimer scheduledTimerWithTimeInterval:velocityFactor target:self selector:@selector(autoscrollTimerFired:) userInfo:nil repeats:NO];
    } else {
        [scrollingTimer invalidate];
    }
}
速度系数是介于0.0到2.5之间的秒数

它在模拟器中运行得很好,但在设备中,它会突然移动,或者我必须说,就像在某一行之后暂停一样。
你能在这里提出解决办法吗?欢迎所有建议。

NSTimer实际上只是周期性地将事件激发到封闭的nsrunlop中,每个线程都有(或应该有)该nsrunlop。因此,如果您有一个子(或后台)进程在另一个线程中运行,NSTimer将针对该线程的nsrunlop而不是应用程序的主nsrunlop启动

NSTimer事件在您计划计时器的线程上触发。如果在主运行循环上安排计时器,则计时器将在主线程上启动,并与输入事件“安全且同步”

所以我有一些建议可以尝试一下(我不确定在你的案例中会成功多少)

不要使用NSTimer。尝试通过带有“afterDelay”的选择器从主线程调用。如代码所示

[self performSelector:@selector(autoScroll) withObject:nil afterDelay:1.0];
使用KVO或NSO通知进行事件触发。(不要直接做,我认为更好的方法。)

我更喜欢KVO,所以在这里写下使用它的步骤:- 使用NSNumber变量创建一个类(该变量应可在类外部访问)。创建该类的对象并在其上添加观察者。(此处模型是该类的对象)

实现它的委托方法

-(void)observeValueForKeyPath:(NSString *)keyPath
                 ofObject:(id)object
                   change:(NSDictionary *)change
                  context:(void *)context
{
  // Do here what ever you want to do. It will call every time whenever there will be  any change in that class variable.
}
在控制器“autoScroll”中创建一个方法,该方法通过afterDelay选择器调用。并更改NSNumber vairabe值的值(任何逻辑增量方式,影响不大)


希望这对你有帮助!!!试试这个……祝你好运

谢谢你的回复。但将NSTimer更改为performselector是一个非常漫长的过程,在完成NSTimer和scroll之后,我需要更改许多逻辑。我们可以用NSTimer做些什么,这样它就可以在设备中像模拟器一样工作了吗?您需要从线程中理解,您创建了NSTimer对象,并从中演示它。尝试从主线程而不是从其他线程调用它。因为NSRunloop在此尝试同时中断其他runloop。在NSTimer“线程化”概念上花费一些时间。因此,我认为你可以更好地使用它。也请阅读以下内容:-
-(void)observeValueForKeyPath:(NSString *)keyPath
                 ofObject:(id)object
                   change:(NSDictionary *)change
                  context:(void *)context
{
  // Do here what ever you want to do. It will call every time whenever there will be  any change in that class variable.
}