UISwipeGestureRecogniser в UICollectionViewCell проблема - PullRequest
0 голосов
/ 27 февраля 2019

У меня есть UICollectionView, где каждая ячейка имеет левую и правую UISwipeGestureRecognizer, что дает иллюзию переворачивания изображения для меню.То, что я не могу понять, как это сделать, это «закрыть / перевернуть» ранее перевернутую ячейку перед тем, как перевернуть другую ячейку.

Вот скриншот того, как это выглядит сейчас:

enter image description here

class Note: UICollectionViewCell {
var isFlipped = false

func addSwipeGestures() {
    let swipeLeft = UISwipeGestureRecognizer(target: self, action: #selector(swipeLeft(swipe:)))
    swipeLeft.direction = UISwipeGestureRecognizer.Direction.left
    contentView.addGestureRecognizer(swipeLeft)

    let swipeRight = UISwipeGestureRecognizer(target: self, action: #selector(swipeRight(swipe:)))
    swipeRight.direction = UISwipeGestureRecognizer.Direction.right
    contentView.addGestureRecognizer(swipeRight)
}

@objc func swipeLeft(swipe: UISwipeGestureRecognizer) {
    if isFlipped {
        flipToBackView(options: .transitionFlipFromLeft)
    }
    else {
        flipToFrontView(options: .transitionFlipFromLeft)
    }
}

@objc func swipeRight(swipe: UISwipeGestureRecognizer) {
    if isFlipped {
        flipToBackView(options: .transitionFlipFromRight)
    }
    else {
        flipToFrontView(options: .transitionFlipFromRight)
    }
}

func flipToBackView(options: UIView.AnimationOptions ) {
    UIView.transition(with: backView, duration: 0.3, options: options, animations: { [unowned self] in
        self.coverImageView.isHidden = false
        self.titleLabel.isHidden = false
        self.titleView.isHidden = false
        self.isFlipped = !self.isFlipped
    })
}

func flipToFrontView(options: UIView.AnimationOptions) {
    UIView.transition(with: backView, duration: 0.3, options: options, animations: { [unowned self] in
        self.coverImageView.isHidden = true
        self.titleLabel.isHidden = true
        self.titleView.isHidden = true
        self.isFlipped = !self.isFlipped
    })
}
}

1 Ответ

0 голосов
/ 27 февраля 2019

Для этого можно использовать шаблон делегирования .Например, вы можете добавить протокол к классу Note:

protocol FlipDelegate: class {
    func willFlip(note: Note)
}

Сделать ViewController соответствующим этому протоколу, сохранить ссылку на последнюю перевернутую карту и снова перевернуть последнюю перевернутую карту:

    weak var lastFlippedNote: Note?

    func willFlip(_ note: Note) {
        lastFlippedNote?. flipToBackView(options: .transitionFlipFromLeft)
        lastFlippedNote = note

    }

Добавьте слабую ссылку на класс Note, например weak var flipDelegate: FlipDelegate?, и присвойте viewController ячейке в collectionView(_:cellForItemAt:).В ваших действиях смахивания вы можете позвонить willFlip(_:), например, когда вы переворачиваете на лицевую сторону заметки, например:

@objc func swipeLeft(swipe: UISwipeGestureRecognizer) {
    if isFlipped {
        flipToBackView(options: .transitionFlipFromLeft)
    }
    else {
        flipToFrontView(options: .transitionFlipFromLeft)
        flipDelegate?.willFlip(note: self)
    }
}

@objc func swipeRight(swipe: UISwipeGestureRecognizer) {
    if isFlipped {
        flipToBackView(options: .transitionFlipFromRight)
    }
    else {
        flipToFrontView(options: .transitionFlipFromRight)
        flipDelegate?.willFlip(note: self)
    }
}

С уважением

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...