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