#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. Если вы просто хотите определить все четыре направления, используйте четыре распознавателя жестов.