Сделав изображение, проведите пальцем и вернитесь в исходное положение внутри контейнера.Custom Slider Swift - PullRequest
0 голосов
/ 04 февраля 2019

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

как я могу изменить этот код, чтобы убедиться, что скользящее изображение не превышает представление контейнера, и оно возвращается в исходное положение.

private func swipeFunc() {
        let swipeGesture = UIPanGestureRecognizer(target: self, action: #selector(acknowledgeSwiped(sender:)))
        swipeImage.addGestureRecognizer(swipeGesture)
        swipeImage.isUserInteractionEnabled = true
        swipeGesture.delegate = self as? UIGestureRecognizerDelegate
    }

    @objc func acknowledgeSwiped(sender: UIPanGestureRecognizer) {
        let minAdjust: CGFloat = 160
        let maxAdjust: CGFloat = 72
        if let sliderView = sender.view {
            if sender.state == UIGestureRecognizer.State.began || sender.state == UIGestureRecognizer.State.changed {
                let translation = sender.translation(in: self.view)
                if sliderView.center.x >= (swipeView.center.x - minAdjust) && sliderView.center.x <= (swipeView.center.x + maxAdjust) {
                    sliderView.center.x = sliderView.center.x + translation.x
                } else if sliderView.center.x >= (swipeView.center.x + maxAdjust) {
                    sliderView.center.x = swipeView.center.x + maxAdjust

//                    dismiss(animated: true, completion: nil)
                } else {
                    sliderView.center.x = swipeView.center.x - minAdjust
                }

                sender.setTranslation(CGPoint.zero, in: self.view)
            } else if sender.state == UIGestureRecognizer.State.ended {
                UIView.animate(withDuration: 0.1, animations: {
                    sliderView.center.x = self.swipeView.center.x - minAdjust
                })
            }
        }
    }

1 Ответ

0 голосов
/ 07 февраля 2019

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

Обновление : добавлено определение края, вы можете добавить необходимую логику для отклонения.

class ViewController: UIViewController {
    @IBOutlet weak var swipeView: UIView!
    @IBOutlet weak var swipeImage: UIImageView!

    override func viewDidLoad() {
        super.viewDidLoad()        
        swipeFunc()
    }

    private func swipeFunc() {
        let swipeGesture = UIPanGestureRecognizer(target: self, action: #selector(acknowledgeSwiped(sender:)))
        swipeImage.addGestureRecognizer(swipeGesture)
        swipeImage.isUserInteractionEnabled = true
        swipeGesture.delegate = self as? UIGestureRecognizerDelegate
    }

    var startingFrame: CGRect?
    @objc func acknowledgeSwiped(sender: UIPanGestureRecognizer) {
        if let sliderView = sender.view {
            let translation = sender.translation(in: swipeView)
            switch sender.state {
            case .began:
                startingFrame = swipeImage.frame
                fallthrough
            case .changed:
                if let startFrame = startingFrame {

                    var movex = translation.x
                    if movex < -startFrame.origin.x { movex = -startFrame.origin.x }

                    let xMax = swipeView.frame.width - startFrame.origin.x - startFrame.width
                    if movex > xMax { movex = xMax }

                    var movey = translation.y
                    if movey < -startFrame.origin.y { movey = -startFrame.origin.y }

                    let yMax = swipeView.frame.height - startFrame.origin.y - startFrame.height
                    if movey > yMax { movey = yMax }

                    sliderView.transform = CGAffineTransform(translationX: movex, y: movey)

                    let sliderCenter = CGPoint(x: swipeImage.frame.midX, y: swipeImage.frame.midY)
                    if !swipeView.bounds.insetBy(dx: 70, dy: 70).contains(sliderCenter) {
                        swipeView.backgroundColor = .red
                    } else {
                        swipeView.backgroundColor = .blue
                    }
                }
            default: // .ended and others:
                UIView.animate(withDuration: 0.1, animations: {
                    sliderView.transform = CGAffineTransform.identity
                })
            }
        }
    }
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...