UISwipeGestureRecognizer 动画
UISwipeGestureRecognizer animation
我正在尝试在我的 collectionViewCell 中实现 UISwipeGestureRecognizer,因此当您向左滑动时,单元格会消失。我想要实现的(我找不到方法)是为滑动设置动画,所以当我向左滑动单元格时,它会消失并带有淡入淡出效果。这是我在方法 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)
}
}
我正在尝试定位单元格的坐标,所以当它位于单元格左侧的某个点时,单元格会播放某种淡入淡出的动画,然后消失。
有什么帮助吗???谢谢!!!
有两种选择可以实现您的目标。
- 创建自定义布局
- 通过滑动手势使用 UIView
创建自定义布局
您可以根据您选择的动画创建自定义布局。 Here 是参考。你只需要修改它的动画即可。
通过滑动手势使用 UIView
按照以下步骤操作
- 在 CollectionView 单元格中添加 UIView(变量名称 -
swipeView
)并设置 UIView 的背景颜色。
- 添加滑动手势(左and/or右)到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
}
您所要做的就是在 viewDidLoad 中调用 setupView()
,就是这样!
我不得不提到我修改了这个问题的代码......
我正在尝试在我的 collectionViewCell 中实现 UISwipeGestureRecognizer,因此当您向左滑动时,单元格会消失。我想要实现的(我找不到方法)是为滑动设置动画,所以当我向左滑动单元格时,它会消失并带有淡入淡出效果。这是我在方法 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)
}
}
我正在尝试定位单元格的坐标,所以当它位于单元格左侧的某个点时,单元格会播放某种淡入淡出的动画,然后消失。
有什么帮助吗???谢谢!!!
有两种选择可以实现您的目标。
- 创建自定义布局
- 通过滑动手势使用 UIView
创建自定义布局
您可以根据您选择的动画创建自定义布局。 Here 是参考。你只需要修改它的动画即可。
通过滑动手势使用 UIView
按照以下步骤操作
- 在 CollectionView 单元格中添加 UIView(变量名称 -
swipeView
)并设置 UIView 的背景颜色。 - 添加滑动手势(左and/or右)到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
}
您所要做的就是在 viewDidLoad 中调用 setupView()
,就是这样!
我不得不提到我修改了这个问题的代码......