Вялый ответ от пользовательского слайдера - PullRequest
0 голосов
/ 02 декабря 2018

Я пытаюсь создать пользовательский слайдер, который использует 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)
        }
    }
}

sluggish_thumb

Ответы [ 2 ]

0 голосов
/ 06 декабря 2018

Наконец-то разобрался.Это происходит только в симуляторе iPhone XR.Пробовал iPhone XS, среди прочего, и они были гладкими, как стекло.

0 голосов
/ 02 декабря 2018

Чтобы это выглядело более плавно, вы должны сбросить перевод панорамы и просто добавлять его непрерывно к центральному смещению:

@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/

Возможно, он старый и в target-c, но он дает общее представление о переопределении UIControl, обработке касаний и создании настраиваемого элемента управления, который также можно расширить с помощью @IBDesignable и @IBInspectable.

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

...