Управление скоростью автоматической прокрутки UITextView

Я пытаюсь сделать приложение для просмотра текстовых файлов в uitextview. Пока что у меня нет проблем с получением данных и прочего.

В моем приложении у меня есть 2 uisliders. один для контроля размера шрифта, а другой для управления скоростью автопрокрутки текстовых представлений.

Моя проблема со вторым (ползунок для управления скоростью автопрокрутки текстовых представлений.)

например, если значение uislider равно 0, текст не прокручивается автоматически, а если значение ползунка больше 0, оно начинает прокручиваться так же быстро, как и задано. что-то вроде:

значение ползунка:0 - 0 автопрокрутка, значение ползунка: 0,25 - 15 пикс. автопрокрутка и т. д.

Есть ли способ сделать это, у меня есть поиск и поиск в Google, но мне не повезло.

2 ответа

Решение

Скорость прокрутки для UITextView исправлено - нет параметра для управления скоростью. Тем не менее, вы можете обойти это:

  • Получите высоту textView contentSize (скажем, 500 pt)
  • Разделите на время, которое вы хотите взять для прокрутки (скажем, 10 секунд, то есть 50pt / sec или 1pt каждые 50 секунд)
  • Создать NSTimer срабатывает каждые 1/50 секунды и настраивает contentOffset по 1pt каждый раз

Конечно, вы можете настроить цифры в соответствии с вашими требованиями.

Скорость автоматической прокрутки текста может быть просто достигнута с помощью Apple CADisplayLink API. Исходя из вашего вопроса, я предполагаю, что вы уже создали свои UIControls textView и UISlider в StoryBoard и правильно связали их как IBOutlets в коде. Не забывая IBAction для того же UISlider, чтобы ответить на пользовательские события. Затем вы должны перейти к соответствующему 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)
    }
}

Надеюсь это поможет.

Удачного кодирования!

Другие вопросы по тегам