Ios 如何在编辑时设置UITableViewCell的动画?

Ios 如何在编辑时设置UITableViewCell的动画?,ios,swift,uitableview,animation,Ios,Swift,Uitableview,Animation,当用户点击表格视图的“编辑”按钮时,如何设置表格视图单元格中颜色更改的动画 当点击编辑按钮时,苹果的动画将所有单元格的内容向右移动,以在每个单元格中显示删除或插入按钮。我想添加我自己的动画,与苹果的动画同时出现。我成功地制作了单元格布局的动画,但没有改变颜色 这就是我正在做的: override func willTransition(to state: UITableViewCellStateMask) { super.willTransition(to: state) le

当用户点击表格视图的“编辑”按钮时,如何设置表格视图单元格中颜色更改的动画

当点击编辑按钮时,苹果的动画将所有单元格的内容向右移动,以在每个单元格中显示删除或插入按钮。我想添加我自己的动画,与苹果的动画同时出现。我成功地制作了单元格布局的动画,但没有改变颜色

这就是我正在做的:

override func willTransition(to state: UITableViewCellStateMask) {
    super.willTransition(to: state)

    let willEdit = state.contains(.showingEditControlMask)

    toDateDaysLayoutConstraint.constant = willEdit ? 5.0 : 25.0
    daysNightsLayoutConstraint.constant = willEdit ? 5.0 : 10.0

    toDateTextView.textColor = willEdit ? UIColor.red : UIColor.darkText
    daysLabel.backgroundColor = willEdit ? UIColor.cyan : UIColor.clear        
}
为了清楚起见,上面的layoutConstraint会正确地更改动画,但是颜色会在没有动画的情况下瞬间更改

我还尝试使用UIView块动画设置颜色动画,如下所示:

    UIView.animate(withDuration: 5.0) { 
        self.toDateTextView.textColor = willEdit ? UIColor.red : UIColor.darkText
        self.daysLabel.backgroundColor = willEdit ? UIColor.cyan : UIColor.clear
    }
但是,我永远无法得到动画的颜色。我已尝试将上述代码放入
willTransition(状态:)
设置编辑(\uu编辑:动画:)
,甚至
布局子视图()
。我也在表控制器方法中尝试过。但是,什么都不管用


更新

到目前为止,我还尝试将所有内容包装在
CATransaction.begin()
CATransaction.commit()
之间,也只使用层动画,甚至在调用
super
之后将
commit
放入
didtransaction
。什么都不管用


我想知道,是否有可能同时制作任何非布局动画的Apple动画?

据我所知,您只能为UIView的“可设置动画的”属性设置动画(请参阅)<代码>文本颜色不在其中。我已经使用了
UIView.transition(带有:duration:options:animations)
并且文本颜色正确地“动画化”:

override func willTransition(to state: UITableViewCellStateMask) {

    super.willTransition(to: state)

    UIView.transition(with: textLabel!, duration: 5.0, options: .transitionCrossDissolve, animations: {
        self.textLabel?.textColor = state.rawValue == 1 ? UIColor.red : UIColor.black
    })
}

编辑1

在你的评论之后,我设法重现了这个问题。我通过重写
didtransformation(to:)
而不是
willTransition(to:)
修复了
UILabel的问题。因此,我们首先等待视图调整大小(因为出现了删除按钮),然后设置动画。但是,这对于
UITextView
,效果不是很好,除非您确保它具有固定的大小

class TableViewCell: UITableViewCell {

    @IBOutlet weak var textView: UITextView!
    @IBOutlet weak var label: UILabel!

    override func didTransition(to state: UITableViewCellStateMask) {

        super.didTransition(to: state)

        UIView.transition(with: textView, duration: 3, options: .transitionCrossDissolve, animations: {
            self.textView.textColor = state.rawValue == 1 ? UIColor.red : UIColor.black
        })

        UIView.transition(with: label, duration: 3, options: .transitionCrossDissolve, animations: {
            self.label.backgroundColor = state.rawValue == 1 ? UIColor.red : UIColor.white
        })
    }
}

编辑2

如果需要调整文本视图的大小,请异步执行动画:

DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
    UIView.transition(with: self.textView, duration: 3, options: .transitionCrossDissolve, animations: {
        self.textView.textColor = state.rawValue == 1 ? UIColor.red : UIColor.black
    })
}

顺便说一下,我还尝试将
UITextView
子类化,并覆盖
layoutSubviews
,但没有成功…

这很好。终于有彩色动画工作了!但是,它还没有完全起作用。现在有一个文本标签的双重图像,我猜,是由两个独立的动画造成的。黑色的文本标签正在移动并淡出,而另一个红色标签则显示在淡入的不同位置。即使我尝试将时间与苹果的动画相匹配,它仍然显得模糊。而且,对于backgroundColor动画,即使与时间匹配,您仍然可以看到标签的双图像。+1对于textColor动画。谢谢你的建议!但是,主要的问题仍然没有得到回答:你怎么能同时制作一个彩色动画和苹果的呢?还是不可能?我会留下问题,看看是否有人能给出答案。@salo.dm你的意思是同时向细胞过渡的彩色动画?是的,没错。就像在
willTransition
中更改布局约束一样。这些变化与苹果为出现的按钮制作的动画同步。那么,如何在显示按钮的同时设置颜色动画呢?