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 ответа:
Есть два варианта достижения вашей цели.
- создание пользовательского макета
- Используйте 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