Логическая проблема: как заставить изображение ячейки продолжать переворачиваться даже после того, как пользователь перелистнул один раз?

#ios #swift #uipangesturerecognizer #caanimation

#iOS #swift #uipangesturerecognizer #caanimation

Вопрос:

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

Что он должен делать

Проблема: после того, как пользователь перелистнул изображение один раз, изображение больше не будет переворачиваться, независимо от того, является ли это тем же касанием или новым. Я знаю, что это логическая проблема. Просто не уверен, как правильно управлять потоком управления здесь… Очень признателен, если кто-нибудь попробует это сделать!

Что он делает

 class GameTileCVC: UICollectionViewController {

override func viewDidLoad() {
    super.viewDidLoad()
    
    collectionView.backgroundColor = .black
    self.collectionView!.register(GameTileCell.self, forCellWithReuseIdentifier: GameTileCell.reuseID)
    addPan()
}


func addPan() {
    let pan = UIPanGestureRecognizer(target: self, action: #selector(handlePan(sender:)))
    view.addGestureRecognizer(pan)
    collectionView.addGestureRecognizer(pan)
}


@objc func handlePan(sender: UIPanGestureRecognizer) {
    if let indexPath = self.collectionView?.indexPathForItem(at: sender.location(in: self.collectionView)) {
        let cell = collectionView?.cellForItem(at: indexPath) as! GameTileCell
        let location = sender.location(in: collectionView)
        
        switch sender.state {
        case .began, .changed, .ended:
            if cell.frame.contains(location) amp;amp; !cell.hasBeenFlipped {
                flip(sender: sender, cell: cell)    // hasBeenFlipped = true
            }
        default:
            break
        }
    }
}


func flip(sender: UIPanGestureRecognizer, view: GameTileCell) {
    let direction = sender.direction(in: collectionView)
    if direction.contains(.Right) {
        UIView.transition(with: view.gameTileImageView, duration: 0.5, options: .transitionFlipFromLeft) {
            self.setImageAndColor(for: view)
        }
    } else if direction.contains(.Left) {
        UIView.transition(with: view.gameTileImageView, duration: 0.5, options: .transitionFlipFromRight) {
            self.setImageAndColor(for: view)
        }
    } else if direction.contains(.Up) {
        UIView.transition(with: view.gameTileImageView, duration: 0.5, options: .transitionFlipFromTop) {
            self.setImageAndColor(for: view)
        }
    } else {
        UIView.transition(with: view.gameTileImageView, duration: 0.5, options: .transitionFlipFromBottom) {
            self.setImageAndColor(for: view)
        }
    }
cell.hasBeenFlipped = true
}
 

Комментарии:

1. Одна из очевидных проблем заключается в том, что вы не проверяете состояние распознавателя жестов. Вы вообще не отслеживаете жест. Вы просто кричите переворачивать снова и снова.

2. @matt Спасибо за честный отзыв. Не был уверен, нужно ли мне отслеживать состояние, поскольку я думаю, что мне нужно, чтобы оно выполняло одно и то же независимо от его состояния, но я думаю, вы правы в том, что это лучшая практика. Теперь я отредактировал OP и включил его вместе с функционирующими ссылками

3. Является ли распознаватель жестов панорамирования правильным? Для одного свайпа вам нужен распознаватель жестов.

4. @matt Мои доводы в пользу использования панорамирования заключаются в том, что я считаю (и я могу ошибаться), что салфетки будут отслеживать только одно направление на касание. В моем случае мне нужно отслеживать несколько направлений одним касанием… Возможно, здесь нужен пользовательский распознаватель жестов?

5. Если вы просто хотите определить все четыре направления, используйте четыре распознавателя жестов.