控制 UITextView 的自动滚动速度
Controlling UITextView's auto scroll speed
我正在尝试制作一个在 uitextview 中查看 txt 文件的应用程序。到目前为止,我在获取数据和内容方面没有遇到任何问题。
在我的应用程序中,我有 2 个 uisliders。一个控制字体大小,另一个控制文本视图自动滚动的速度。
我的问题是第二个(控制文本视图自动滚动速度的滑块。)
在示例中,如果 uislider 值为 0,则文本不会自动滚动,如果滑块值大于 0,它将开始按照设置的速度滚动。
类似于:
滑块value:0 - 0 自动滚动,
滑块 value:0.25 - 15 像素自动滚动
等等...
有没有办法做到这一点,我进行了搜索和谷歌搜索,但我没有运气。
UITextView
的滚动速度是固定的 - 没有控制速度的参数。但是,您可以解决此问题:
- 获取 textView 的高度
contentSize
(比如说 500 pt)
- 除以滚动所需的时间(例如 10 秒,即 50 磅/秒,或每 50 秒 1 磅)
- 创建一个每 1/50 秒触发一次的
NSTimer
,每次将 contentOffset
调整 1pt
当然你可以调整数字以满足你的要求
文本的自动滚动速度可以简单地使用 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)
}
}
希望对您有所帮助。
编码愉快!
我正在尝试制作一个在 uitextview 中查看 txt 文件的应用程序。到目前为止,我在获取数据和内容方面没有遇到任何问题。
在我的应用程序中,我有 2 个 uisliders。一个控制字体大小,另一个控制文本视图自动滚动的速度。
我的问题是第二个(控制文本视图自动滚动速度的滑块。)
在示例中,如果 uislider 值为 0,则文本不会自动滚动,如果滑块值大于 0,它将开始按照设置的速度滚动。 类似于:
滑块value:0 - 0 自动滚动, 滑块 value:0.25 - 15 像素自动滚动 等等...
有没有办法做到这一点,我进行了搜索和谷歌搜索,但我没有运气。
UITextView
的滚动速度是固定的 - 没有控制速度的参数。但是,您可以解决此问题:
- 获取 textView 的高度
contentSize
(比如说 500 pt) - 除以滚动所需的时间(例如 10 秒,即 50 磅/秒,或每 50 秒 1 磅)
- 创建一个每 1/50 秒触发一次的
NSTimer
,每次将contentOffset
调整 1pt
当然你可以调整数字以满足你的要求
文本的自动滚动速度可以简单地使用 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)
}
}
希望对您有所帮助。
编码愉快!