如何来回移动 UITableViewCell 以显示它可以滑动?

Posted

技术标签:

【中文标题】如何来回移动 UITableViewCell 以显示它可以滑动?【英文标题】:How to move UITableViewCell back and forth to show it can be swiped? 【发布时间】:2017-10-23 03:05:27 【问题描述】:

我在某些应用程序中看到,当您进入带有表格视图的屏幕时,单元格开始滑动的简短动画,显示红色的“滑动删除”按钮(UIContextualAction 按钮),然后它恢复正常。它给用户提示:“这些行可以滑动。”

有没有办法达到这个效果?也许是一种以编程方式启动行滑动然后取消它的方法?

【问题讨论】:

给你***.com/questions/45690519/… 【参考方案1】:

迅捷解决方案

嗯,大约 1.5 年后,我终于想出了一个解决方案。

第 1 步 - 单元 UI 设置

我这样设置自定义表格视图单元格:

A 和 B 代表滑动动作颜色。 C 是 UIView,我将并排设置动画。

第 2 步 - 向单元格添加动画

func animateSwipeHint() 
    slideInFromRight()


private func slideInFromRight() 
    UIView.animate(withDuration: 0.5, delay: 0.3, options: [.curveEaseOut], animations: 
        self.cellBackgroundView.transform = CGAffineTransform(translationX: -self.swipeHintDistance, y: 0)
        self.cellBackgroundView.layer.cornerRadius = 10
    )  (success) in
        UIView.animate(withDuration: 0.2, delay: 0, options: [.curveLinear], animations: 
            self.cellBackgroundView.transform = .identity
        , completion:  (success) in
            // Slide from left if you have leading swipe actions
            self.slideInFromLeft()
        )
    


private func slideInFromLeft() 
    UIView.animate(withDuration: 0.5, delay: 0, options: [.curveEaseOut], animations: 
        self.cellBackgroundView.transform = CGAffineTransform(translationX: self.swipeHintDistance, y: 0)
    )  (success) in
        UIView.animate(withDuration: 0.2, delay: 0, options: [.curveLinear], animations: 
            self.cellBackgroundView.transform = .identity
        )
    

第 3 步 - 触发动画

在具有表格视图的视图控制器的viewDidLoad 中,我有以下代码:

if self.tableView.visibleCells.count > 0 
    let cell = self.tableView.visibleCells[0] as! TableViewCell
    cell.animateSwipeHint()

示例:

视频解决方案

如果您想更深入地了解此解决方案,我制作了一个视频: https://youtu.be/oAGoFd_GrxE

【讨论】:

很好,很欣赏定制设计。谢谢。【参考方案2】:

我有一段很久以前看过的代码来为视图设置动画。因为我们的UITableViewCell 也是一个视图,我们可以使用它:) 你只需要让你的可见单元格动画,就像这样:

if let visibleCell = self.tableView.cellForRow(at: IndexPath(row: 0, section: 0)) as? CustomCell 
        print("Started animation...")
        let animation = CAKeyframeAnimation(keyPath: "transform.translation.x")
        animation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionLinear)
        animation.duration = 0.6
        animation.values = [-20.0, 20.0, -20.0, 20.0, -10.0, 10.0, -5.0, 5.0, 0.0 ]
        visibleCell.layer.add(animation, forKey: "shake")
    

如果这有帮助,请告诉我。测试过了。

编辑:

动画你的UITableView 让用户看到他们可以在单元格上滑动非常简单,试试这样:

    DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(1)) 
        self.tableView.setEditing(true, animated: true)
        DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(1)) 
            self.tableView.setEditing(false, animated: true)
        
    

但是,如果您想以编程方式滑动您的单元格以显示您的自定义行操作(我已经研究了一个小时),据我所知,您只能通过使用方法 swizzling 来实现这一点。看到这个答案:http://codejaxy.com/q/186524/ios-swift-uitableview-how-to-present-uitableviewrowactions-from-pressing-a-button

【讨论】:

谢谢,@Glenn,虽然这确实会左右晃动单元格的内容视图,但它不会暴露按钮 (UIContextActions)。我将修改我的问题以澄清。 谢谢@Glenn,但是当我尝试第二个代码示例时,它会在单元格右侧显示圆形删除按钮。混乱的答案看起来很有趣,但我只是想看看是否有任何公开的面向 API 的解决方案。 谢谢,这对于 UITableView 的内置方法非常简单且很好

以上是关于如何来回移动 UITableViewCell 以显示它可以滑动?的主要内容,如果未能解决你的问题,请参考以下文章

为 uitableviewcell 内的视图设置动画

如何使用 jquery 的 animate 方法使 div 来回移动

如何在swift中水平来回移动角色

如何编写我的 HTML 登录表单以显式启用 LastPass?

如何将 UITableViewCell 从“正常”视图切换为透明,然后再返回

如何获得 UITableViewCell 移动开始和结束的通知?