首页 文章

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

提问于
浏览
0

我正在开发一个项目,我在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 回答

  • 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值的值(任何逻辑增量方式 . 不会影响很多) .

    希望这对你有所帮助!!!试试吧......祝您好运

相关问题