UIPanGesture распознаватель, проводящий только в одном направлении - PullRequest
0 голосов
/ 27 сентября 2018

Я работаю над UIPanGestureRecognizer и для меня это работает.но у меня есть некоторые проблемы, так как я новичок в iOS и только что перешел с Android на iOS.Сначала взгляните на то, что я хочу сделать:

Что я хочу: У меня есть UITableView, и я хочу выполнить считывание на ячейках.Я просто хочу перетащить их слева направо и переместить / удалить эту ячейку.Почти так же, как это сделано в Android.

Но я просто хочу переместить предмет только в одном направлении.И это "ЛЕВАЯ ПРАВА".Но не справа налево.Теперь взглянем на то, что я сделал до сих пор

Что я сделал:

    @objc func handlePan(recognizer: UIPanGestureRecognizer) {
    // 1
    if recognizer.state == .began {
        // when the gesture begins, record the current center location
        originalCenter = center
        print("Center",originalCenter)

    }
    // 2
    if recognizer.state == .changed {
        let translation = recognizer.translation(in: self)


        center = CGPoint(x: originalCenter.x+translation.x, y: originalCenter.y)

        // has the user dragged the item far enough to initiate a delete/complete?
        deleteOnDragRelease = frame.origin.x < -frame.size.width / 2.0
        completeOnDragRelease = frame.origin.x > frame.size.width / 2.0
        // print ("FrameX = ",frame.origin.x , " , ","Width = ",frame.size.width / 2.0 , "Total = ",frame.origin.x < -frame.size.width / 2.0 )
        //print ("DelOnDrag = ",deleteOnDragRelease , " , ","CompOnDrag = ",completeOnDragRelease)

    }
    // 3
    if recognizer.state == .ended {
        // the frame this cell had before user dragged it
        let originalFrame = CGRect(x: 0, y: frame.origin.y,
                                   width: bounds.size.width, height: bounds.size.height)
        if deleteOnDragRelease {
            if delegate != nil && clickedItem != nil {
                // notify the delegate that this item should be deleted
                delegate!.toDoItemDeleted(clickedItem: clickedItem!)
            }
        } else if completeOnDragRelease {

            UIView.animate(withDuration: 8.2, animations: {self.frame = originalFrame})
        } else {
            UIView.animate(withDuration: 8.2, animations: {self.frame = originalFrame})
        }
    }
}

Я знаю, что могу проверить ".changed"и вычислить, будет ли значение X приближаться к 0 или меньше, чем 0. Но точка в течение некоторого времени будет перемещать элемент справа налево.

Вопрос: Можно ли как-нибудь получить значение x точки контакта?или просто как я могу заставить пользователя хотеть смахивать справа налево и просто мешать пользователю делать это ??Пожалуйста, поделитесь своими знаниями

Ответы [ 2 ]

0 голосов
/ 27 сентября 2018

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

override func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
        if let panGestureRecognizer = gestureRecognizer as? UIPanGestureRecognizer {
            let translation = panGestureRecognizer.translation(in: superview!)
            if translation.x >=  0 {
                return true
            }
            return false
        }
        return false
    }

Удачи.

Продолжайте кодировать.

0 голосов
/ 27 сентября 2018

Вы можете сделать это, используя следующие расширения

extension UIPanGestureRecognizer {

    enum GestureDirection {
        case Up
        case Down
        case Left
        case Right
    }

    func verticalDirection(target: UIView) -> GestureDirection {
        return self.velocity(in: target).y > 0 ? .Down : .Up
    }

    func horizontalDirection(target: UIView) -> GestureDirection {
        return self.velocity(in: target).x > 0 ? .Right : .Left
    }   
}

И вы можете получить направление, как показано ниже

gestureRecognizer.horizontalDirection(target: self)
...