我有一个UICollectionView
,每个单元格都有一个左右UISwipeGestureRecognizer
,给人一种翻转图像菜单的错觉。我无法弄清楚该怎么做的事情是在关闭另一个细胞之前“关闭/翻转”先前翻转过的细胞。
这是现在的截图:
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
})
}
}
你可以使用delegation pattern。例如。你可以在Note类中添加一个协议:
protocol FlipDelegate: class {
func willFlip(note: Note)
}
使ViewController符合此协议,将引用存储到最后翻转的卡并再次翻转最后翻转的卡:
weak var lastFlippedNote: Note?
func willFlip(_ note: Note) {
lastFlippedNote?. flipToBackView(options: .transitionFlipFromLeft)
lastFlippedNote = note
}
像weak var flipDelegate: FlipDelegate?
一样添加对Note类的弱引用,并将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)
}
}
问候