控制UITextView的自动滚动速度

时间:2015-05-06 13:05:22

标签: ios uitextview uislider autoscroll

我正在尝试创建一个应用程序来查看uitextview中的txt文件。到目前为止,我没有获取数据和东西的问题。

在我的应用程序中,我有2个uisliders。一个用于控制字体大小,另一个用于控制textviews autoscroll的速度。

我的问题在于第二个(用于控制textviews autoscroll速度的滑块。)

例如,如果uislider值为0,则文本不会自动滚动,如果滑块值大于0,则开始按设置的速度滚动。 类似的东西:

滑块值:0 - 0自动滚动, 滑块值:0.25 - 15 px autoscroll 等等...

有没有办法做到这一点,我搜索和谷歌搜索,但我没有运气。

2 个答案:

答案 0 :(得分:1)

使用Apple's CADisplayLink API可以简单地实现文本的自动滚动速度。从您的问题来看,我假设您已经在StoryBoard中创建了textView和UISlider UIControl,并且已经在代码中将它们正确地连接为IBOutlets。不要忘记同一个UISlider的IBAction响应用户事件。然后,您应该转到相应的ViewController并执行以下操作:

class ViewController: UIViewController {

    //MARK: Vars
    private var speed: CGFloat = 0.0
    private var displayLink: CADisplayLink?

    var timer:Timer?

    //IBOutlets
    @IBOutlet weak var scrollSpeedSlider: UISlider!
    @IBOutlet weak var textView: UITextView!

    //MARK: LifeCycle
    override func viewDidLoad() {
        super.viewDidLoad() 

       // Load up initial scrollSpeedSlider value
        speed = CGFloat(scrollSpeedSlider.value)

    }

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)

        //Initialize a new display link inside a displayLink variable, providing 'self' 
        //as target object and a selector to be called when the screen is updated. 
        displayLink = CADisplayLink(target: self, selector: #selector(step(displaylink:)))

        // And add the displayLink variable to the current run loop with default mode.
        displayLink?.add(to: .current, forMode: .defaultRunLoopMode)
    }

 //The selector to be called when the screen is updated each time
    @objc func step(displaylink: CADisplayLink) {

        //Variable to capture and store the ever so changing deltatime/time lapsed of  
        //every second after the textview loads onto the screen
        let seconds = displaylink.targetTimestamp - displaylink.timestamp

        //Set the content offset on the textview to start at x position 0, 
        //and to its y position-parameter, pass the slider speed value multiplied by the changing time delta. 
       //This will ensure that the textview automatically scrolls, 
       //and also accounts for value changes as users slider back and forth.
        textView.setContentOffset(CGPoint(x: 0, y: textView.contentOffset.y + speed * CGFloat(seconds) * 100), animated: false)
    }

    // MARK: - IBActions

    @IBAction func scrollSpeedValueChanged(_ sender: UISlider) {

        //Here's where we capture the slider speed value as user slide's back and forth
        speed = CGFloat(sender.value)
    }
}

希望这有帮助。

快乐的编码!

答案 1 :(得分:0)

UITextView的滚动速度是固定的 - 没有参数来控制速率。但是,您可以解决此问题:

  • 获取textView的contentSize(比如说​​500 pt)
  • 的高度
  • 除以您想要滚动的时间(例如10秒,50pt / sec或每50秒1pt)
  • 创建每1/50秒触发一次的NSTimer并每次调整contentOffset 1pt

您可以调整数字以满足您的要求,当然