Uiswipegesturerecognizer анимация


Я пытаюсь реализовать UISwipeGestureRecognizer в моем collectionViewCell, поэтому, когда вы проводите влево, ячейка исчезает. То, что я пытаюсь реализовать (я не могу найти способ сделать это), - это анимировать свайп, поэтому, когда я провожу ячейку влево, она исчезает с эффектом затухания. Это код, который я имею внутри метода cellForItemAtindexPath

let cSelector = #selector(reset(sender:))
    let UpSwipe = UISwipeGestureRecognizer(target: self, action: cSelector)
    UpSwipe.direction = UISwipeGestureRecognizerDirection.left
    cell.addGestureRecognizer(UpSwipe)

Метод

 func reset(sender: UISwipeGestureRecognizer) {

    let cell = sender.view as! UICollectionViewCell
    let i = self.collectionView?.indexPath(for: cell)!.item


    self.messages.remove(at: i!)
    self.collectionView?.reloadData()

}

Спасибо!!!

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

CellForItemAt

let gestureRecognizer = UIPanGestureRecognizer(target: self, action: #selector(handlePan(gestureRecognizer:)))
    cell.addGestureRecognizer(gestureRecognizer)

Метод

func handlePan(gestureRecognizer: UIPanGestureRecognizer) {
    if gestureRecognizer.state == .began {
        // When the drag is first recognized, you can get the starting coordinates here

    }

    if gestureRecognizer.state == .changed {
        let translation = gestureRecognizer.translation(in: self.view)
        // Translation has both .x and .y values

        if translation.x == translation.x - 100 {
            //Method i putted before
            reset(sender: gestureRecognizer)
        }

        //print(translation.x, translation.y)
    }
}

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

Какая-нибудь помощь??? Спасибо!!!

2 2

2 ответа:

Есть два варианта достижения вашей цели.

  1. создание пользовательского макета
  2. Используйте UIView с жестом swipe


создание пользовательского макета
вы можете создать пользовательский макет в соответствии с вашим выбором анимации. здесь - Ссылка. Вам просто нужно изменить его анимацию.


используйте UIView с жестом салфетки
выполните следующие действия

  • Добавить UIView (var name - swipeView) в ячейку CollectionView & set цвет фона для UIView.
  • Добавить жест свайпа (влево и / или вправо) в swipeView
  • обрабатывайте свайп Вида вместе с операцией перетаскивания пользователя, используя различные состояния жеста свайпа (начало, перетаскивание, конец).
  • когда жест свайпа закончится, вытолкните swipeView из своей ячейки с анимацией (установите x-позицию из них так, чтобы она могла выйти за пределы кадра ячейки)
  • удалить элемент из массива и перезагрузить представление коллекции.

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

Итак, я попробовал этот код, и он отлично работает для меня!

func setupView(){
    // Setting up swipe gesture recognizers
    let swipeUp : UISwipeGestureRecognizer = UISwipeGestureRecognizer(target: self, action: #selector(userDidSwipeUp(_:)))
    swipeUp.direction = .left

    collectionView?.addGestureRecognizer(swipeUp)

    //let swipeDown : UISwipeGestureRecognizer = UISwipeGestureRecognizer(target: self, action: #selector(userDidSwipeDown))
    //swipeDown.direction = .right

    //collectionView?.addGestureRecognizer(swipeDown)
}


func getCellAtPoint(_ point: CGPoint) -> ChatMessageCell? {
    // Function for getting item at point. Note optionals as it could be nil
    let indexPath = collectionView?.indexPathForItem(at: point)
    var cell : ChatMessageCell?

    if indexPath != nil {
        cell = collectionView?.cellForItem(at: indexPath!) as? ChatMessageCell
    } else {
        cell = nil
    }

    return cell
}

func userDidSwipeUp(_ gesture : UISwipeGestureRecognizer) {

    let point = gesture.location(in: collectionView)  //collectionview
    let duration = animationDuration()                //0.5

    if(cell == nil){
        cell = getCellAtPoint(point)

        UIView.animate(withDuration: duration, animations: {
            //self.activeCell.myCellView.transform = CGAffineTransform(translationX: 0, y: -self.activeCell.frame.height)
            self.cell.celdaNormal.transform = CGAffineTransform(translationX: -self.cell.frame.width , y: 0)

        })

    }  else {
        // Getting the cell at the point
        let cell = getCellAtPoint(point)

        // If the cell is the previously swiped cell, or nothing assume its the previously one.
        if cell == nil || cell == cell {
            // To target the cell after that animation I test if the point of the swiping exists inside the now twice as tall cell frame
            let cellFrame = cell?.frame

            var rect = CGRect()

            if cell != nil {
                rect = CGRect(x: (cellFrame?.origin.x)! - (cellFrame?.width)!, y: (cellFrame?.origin.y)!, width: (cellFrame?.width)!*2, height: (cellFrame?.height)!)
            }

            if rect.contains(point) {
                // If swipe point is in the cell delete it

                let indexPath = collectionView?.indexPath(for: cell!)
                messages.remove(at: indexPath!.row)
                collectionView?.deleteItems(at: [indexPath!])

                if messages.count == 0 {
                    reusableView.etiqueta.isHidden = true
                }
            }
            // If another cell is swiped
        }
}

func animationDuration() -> Double {
    return 0.5
}

Все, что вам нужно сделать, это вызвать setupView() в viewDidLoad, и все! Я должен упомянуть, что я изменил код из этого вопроса... проведите пальцем, чтобы удалить на CollectionView