自定义滑块响应缓慢

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 等,它们像玻璃一样光滑。