我正在开发一个项目,我在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之间的秒数 .
它在模拟器中运行良好,但在设备中它会随着抽搐移动,或者我必须说在某些线路之后暂停 . 你能在这里建议任何解决方案吗?欢迎所有建议 .
1 回答
NSTimers实际上只是定期将事件激发到封闭的NSRunLoop中,每个线程都有(或应该有) . 因此,如果您有一个在不同线程中运行的子(或后台)进程,NSTimers将触发该线程的NSRunLoop而不是应用程序的主NSRunLoop .
NSTimer事件在您安排计时器的线程上触发 . 如果您在主运行循环上安排了计时器,那么计时器将在主线程上触发并与输入事件“安全并同步” .
所以我有一些尝试的建议(我不知道你的情况会有多大成功)
不要使用NSTimer . 尝试通过选择器使用“afterDelay”从主线程调用 . 如代码中所示
使用KVO或可能是NSNotification用于事件触发 . (不是直接做,我认为更好的方法 . )
我更喜欢KVO,所以在这里写下使用它的步骤: - 创建一个带有NSNumber变量的类(应该可以在类外访问) . 创建该类的对象并在其上添加一个Observer . (这里的模型是该类的对象) .
实现它的委托方法 .
在控制器“autoScroll”中创建一个通过afterDelay选择器调用的方法 . 并更改NSNumber vairabe值的值(任何逻辑增量方式 . 不会影响很多) .
希望这对你有所帮助!!!试试吧......祝您好运