UIView.animateWithDuration 在滚动 uitableviewcell 后停止

Posted

技术标签:

【中文标题】UIView.animateWithDuration 在滚动 uitableviewcell 后停止【英文标题】:UIView.animateWithDuration stops after scrolling uitableviewcell 【发布时间】:2016-05-19 07:12:22 【问题描述】:

我在 uiTableViewCell 中添加了一个无限动画,它只会在表格视图单元格内闪烁一个 UILabel。

我的问题是,当我滚动表格视图时它只是停止闪烁

我的代码是

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
    let cell = tableView.dequeueReusableCellWithIdentifier("TripListCell", forIndexPath: indexPath) as! TripListCell
    
    let trip = tripList[indexPath.section]
    cell.lblTripDirection.textColor = UIColor(red: 51/255, green: 210/255, blue: 123/255, alpha: 1.0)
    
    UIView.animateWithDuration(0.5, delay: 0.0, options: [.CurveEaseInOut, .Repeat, .Autoreverse, .AllowUserInteraction], animations: 
        
        cell.lblTripDirection.alpha = 0.0
        , completion: 
            bool in
        cell.lblTripDirection.alpha = 1.0
        cell.lblTripDirection.textColor = UIColor.blackColor()
    )
    return cell

更新:

返回单元格之前的 UIView.commitAnimations() 对我有用。 谢谢大家:)

【问题讨论】:

【参考方案1】:

这是因为cellForRowAtIndexPath 重复使用同一个单元格来显示其他数据。所以你不应该在cellForRowAtIndexPath中写你的动画。

你应该尝试写在custom cell classawakeFromNib或者你应该使用willDisplayCell方法来写动画。

希望这会有所帮助:)

【讨论】:

awakeFromNib: 问题依旧, @ParthBhuva 这是一个非常古老的问题,但你最终解决了这个问题吗?【参考方案2】:

您可以在自定义单元格TripListCell 中覆盖 UITableViewCell 的 prepareForReuse 方法。

每次调用dequeueReusableCellWithIdentifier 时都会调用prepareForReuse

【讨论】:

【参考方案3】:

你应该把你的代码放在这个 UITableViewDelegate 方法中:

func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath);

【讨论】:

【参考方案4】:

TableView 重复使用它们的单元格,因此您的标签不可避免地会停止它们的动画。

您可以在自定义表格视图单元格上的prepareForReuse:tableView:willDisplayCell:forRowAtIndexPath: delegate method 中将重复使用的单元格恢复为其默认状态。

在这种情况下你使用 UIView 动画,你只需要改变动画属性的值来取消动画并返回到默认状态。

func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) 

    //declaring the cell variable again

    var cell: TripListCell = self.tableView.dequeueReusableCellWithIdentifier("cell") as! TripListCell
    UIView.performWithoutAnimation 
        cell.lblTripDirection.layoutIfNeeded()
    
    // do your animation..
    ...

【讨论】:

【参考方案5】:

返回单元格之前的 UIView.commitAnimations() 对我有用。

【讨论】:

你在哪里声明了 UIView.commitAnimations() ?你有一个可行的例子吗?

以上是关于UIView.animateWithDuration 在滚动 uitableviewcell 后停止的主要内容,如果未能解决你的问题,请参考以下文章