【问题标题】:Swift animate view in tableviewcelluitableviewcell 中的 Swift 动画视图
【发布时间】:2017-09-18 10:50:51
【问题描述】:

对于我正在开发的应用程序,我使用的是 tableview。我的 tableview,当然有一个 tableviewcell。在那个 tableviewcell 中,我以编程方式添加了一个视图(所以情节提要中没有任何内容)。这是一个我画一些线条和文本的视图,它变成了一个消息气泡。如果您发送的其他用户也看到了消息气泡,则气泡的一行将打开。

所以我在那个 UIView (sendbubble.swift) 的类中有动画功能

现在,它已经检查了它是否被读取并打开了正确的气泡。但通常它应该在 0.6 秒内动画(打开的线应该旋转)。但它会立即动画。所以我的问题是,我如何用持续时间为它制作动画?

我还希望在我的自定义 UIView 类 (sendbubble.swift) 中仍然调用它。也许我需要在我的函数中使用代码来检查单元格是否出现在我的 iPhone 上?

提前致谢!

func openMessage() {
    UIView.animate(withDuration: 0.6, delay: 0.0, options: [], animations: {
        var t = CATransform3DIdentity;
        t = CATransform3DMakeRotation(CGFloat(3 * Float.pi / 4), 0, 0, 1)
        self.moveableLineLayer.transform = t;
    }, completion:{(finished:Bool) in })
}

【问题讨论】:

  • 将self.view.layoutifneeded()写入uiview.animate
  • @JeckyModi 它说“sendbubble 类型的值没有成员视图”但 sendbubble 是 UIView 类?

标签: ios swift uitableview animation


【解决方案1】:

首先你需要抓住细胞。

  1. 获取需要显示打开气泡的单元格的 indexPath。
  2. tableView.cellForRowAt(at:indexPath)获取单元格
  3. 我们现在可以访问该气泡视图,现在您可以使用相同的函数 func openMessage() 进行动画处理

有什么问题吗?评论。

【讨论】:

  • 感谢您的回复!你想让我在哪里得到索引路径?在我的 VC 类中,tableview 在哪里?还是细胞的类别?还是我的 sendbubble 的类?
  • 在您的 tableView 所在的 VC 中。必须有一些 Web 服务调用,您可以在其中确定消息已发送,从那里找到您在 tableView 中填充的数组中的消息对象的索引。单元格的索引也将相同。使用该索引获取单元格。
  • 我可以获取索引等,但它仍然没有动画,动画已经完成。所以我需要在单元格完全加载后调用它。你知道如何实现吗?
  • 是的,您需要在加载的单元格(可见单元格)上制作动画。我还没有测试过你的动画方法,但是尝试一些普通的动画方法它肯定可以工作。
【解决方案2】:

需要实现UITableViewDelegate方法tableView(_:willDisplay:forRowAt:)https://developer.apple.com/reference/uikit/uitableviewdelegate/1614883-tableview

当单元格即将被绘制时触发 - 而不是在创建时触发。您还需要在模型中存储一个状态,说明动画是否已发生,否则每次单元格返回视图时都会发生。

示例

在视图控制器中(伪代码)

class CustomViewController: UITableViewDelegate {
    //where ever you define your tableview
    var tableView:UITableView
    tableView.delegate = self

    var dataSource //some array that is defining your cells - each object has a property call hasAnimated

    func tableView(_ tableView: UITableView, willDisplay cell: ITableViewCell, 
           forRowAt indexPath: IndexPath) {
        if let cell = cell as? CustomTableViewCell, dataSource[indexPath.row].hasAnimated == false {
            dataSource[indexPath.row].hasAnimated = true
            cell.openMessage()
        }
    }
}

class CustomTableViewCell: UITableViewCell {
    func openMessage() { //your method
    }
} 

【讨论】:

  • 我不能在我的 UIView 类中调用那个方法?我已经添加了 UITableViewDelegate,我确实添加了这个方法,但它没有被调用。
  • 你能分享一下你用来添加委托和调用方法的代码吗?您绝对可以在 UIView 类中调用该方法,假设它被 TableViewCell 引用 - 您可以使用 indexPath 获取它。
  • 类 sendBubble: UIView, UITableViewDelegate {}
  • func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) { print("this doesn't print") if (messageSeen == "last seen") { openMessage( ) } }
  • 查看我的编辑 - 你必须设置一个对象作为你的 UITableViewDelegate - 这不应该是你的单元格,因为一次只有 1 个委托。这就是为什么委托方法可以引用单元格的原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-09
  • 1970-01-01
  • 2021-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-25
相关资源
最近更新 更多