自定义滑块响应缓慢
Sluggish response from custom slider
我正在尝试创建一个使用 UIButton
作为滑块的自定义滑块。由于我似乎无法找到一种方法来使用 UIView
作为滑块中的拇指,所以我决定构建一个自定义滑块。但是,当我 运行 它时,拇指在初始拖动时反应迟钝。以下是到目前为止的代码。下面的 gif 比实际速度慢 运行,但说明了这一点。
import Foundation
import UIKit
class CustomSlider: UIView, UIGestureRecognizerDelegate {
let buttonView = UIButton()
var minimumPosition = CGPoint()
var maximumPosition = CGPoint()
var originalCenter = CGPoint()
override init(frame: CGRect) {
super.init(frame: frame)
commonInit()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
commonInit()
}
func commonInit() {
// add a pan recognizer
let recognizer = UIPanGestureRecognizer(target: self, action: #selector(handlePan(recognizer:)))
recognizer.delegate = self
addGestureRecognizer(recognizer)
backgroundColor = UIColor.green
buttonView.frame = CGRect(x: 0, y: 0, width: bounds.height, height: bounds.height)
buttonView.backgroundColor = UIColor.purple
self.addSubview(buttonView)
minimumPosition = CGPoint(x:buttonView.frame.width / 2, y: 0)
maximumPosition = CGPoint(x: bounds.width - buttonView.frame.width / 2, y: 0)
}
@objc func handlePan(recognizer: UIPanGestureRecognizer) {
if recognizer.state == .began {
originalCenter = buttonView.center
}
if recognizer.state == .changed {
let translation = recognizer.translation(in: self)
let newX = originalCenter.x + translation.x
buttonView.center = CGPoint(x: min(maximumPosition.x, max(minimumPosition.x, newX)), y: buttonView.frame.midY)
}
}
}
为了让它看起来更平滑,您应该重置平移的平移,并将其连续添加到中心偏移量:
@objc func handlePan(recognizer: UIPanGestureRecognizer) {
if recognizer.state == .began {
// originalCenter = buttonView.center
}
if recognizer.state == .changed {
originalCenter = buttonView.center
let translation = recognizer.translation(in: self)
let newX = originalCenter.x + translation.x
buttonView.center = CGPoint(x: min(maximumPosition.x, max(minimumPosition.x, newX)), y: buttonView.frame.midY)
recognizer.setTranslation(.zero, in: self)
}
}
另外,关于制作自定义控件,你可以看看这个教程:
https://www.sitepoint.com/wicked-ios-range-slider-part-one/
它可能是旧的并且在 objective-c 中,但它给出了覆盖 UIControl、处理触摸和创建自定义控件的一般概念 - 您也可以使用 @IBDesignable 和 @IBInspectable 对其进行扩展。
希望对您有所帮助。
终于想通了。它只发生在 iPhone XR 模拟器中。尝试了 iPhone XS 等,它们像玻璃一样光滑。
我正在尝试创建一个使用 UIButton
作为滑块的自定义滑块。由于我似乎无法找到一种方法来使用 UIView
作为滑块中的拇指,所以我决定构建一个自定义滑块。但是,当我 运行 它时,拇指在初始拖动时反应迟钝。以下是到目前为止的代码。下面的 gif 比实际速度慢 运行,但说明了这一点。
import Foundation
import UIKit
class CustomSlider: UIView, UIGestureRecognizerDelegate {
let buttonView = UIButton()
var minimumPosition = CGPoint()
var maximumPosition = CGPoint()
var originalCenter = CGPoint()
override init(frame: CGRect) {
super.init(frame: frame)
commonInit()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
commonInit()
}
func commonInit() {
// add a pan recognizer
let recognizer = UIPanGestureRecognizer(target: self, action: #selector(handlePan(recognizer:)))
recognizer.delegate = self
addGestureRecognizer(recognizer)
backgroundColor = UIColor.green
buttonView.frame = CGRect(x: 0, y: 0, width: bounds.height, height: bounds.height)
buttonView.backgroundColor = UIColor.purple
self.addSubview(buttonView)
minimumPosition = CGPoint(x:buttonView.frame.width / 2, y: 0)
maximumPosition = CGPoint(x: bounds.width - buttonView.frame.width / 2, y: 0)
}
@objc func handlePan(recognizer: UIPanGestureRecognizer) {
if recognizer.state == .began {
originalCenter = buttonView.center
}
if recognizer.state == .changed {
let translation = recognizer.translation(in: self)
let newX = originalCenter.x + translation.x
buttonView.center = CGPoint(x: min(maximumPosition.x, max(minimumPosition.x, newX)), y: buttonView.frame.midY)
}
}
}
为了让它看起来更平滑,您应该重置平移的平移,并将其连续添加到中心偏移量:
@objc func handlePan(recognizer: UIPanGestureRecognizer) {
if recognizer.state == .began {
// originalCenter = buttonView.center
}
if recognizer.state == .changed {
originalCenter = buttonView.center
let translation = recognizer.translation(in: self)
let newX = originalCenter.x + translation.x
buttonView.center = CGPoint(x: min(maximumPosition.x, max(minimumPosition.x, newX)), y: buttonView.frame.midY)
recognizer.setTranslation(.zero, in: self)
}
}
另外,关于制作自定义控件,你可以看看这个教程: https://www.sitepoint.com/wicked-ios-range-slider-part-one/
它可能是旧的并且在 objective-c 中,但它给出了覆盖 UIControl、处理触摸和创建自定义控件的一般概念 - 您也可以使用 @IBDesignable 和 @IBInspectable 对其进行扩展。
希望对您有所帮助。
终于想通了。它只发生在 iPhone XR 模拟器中。尝试了 iPhone XS 等,它们像玻璃一样光滑。