UIView.animateWithDuration在UITableviewCell中不起作用

时间:2015-06-09 08:04:42

标签: ios uitableview swift animation cell

我有一个UITableviewCell子类,其中包含一个UIButton,它被放置在屏幕外(右侧),并带有一个Autolayout水平空间约束,它的超级视图为-312。

现在,我想在选择单元格时将此约束设置为-8的值。

我在单元格类中为此约束创建了一个插座,我尝试使用以下代码为此约束设置动画:

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    let cell = tableView.dequeueReusableCellWithIdentifier("VariationsTableViewCell", forIndexPath: indexPath) as! VariationsCell

    UIView.animateWithDuration(1.0, delay: 0.0, options: .CurveEaseOut, animations: {

        cell.buttonRightSideConstraint.constant = -8

        }, completion: { finished in
            println("Button revealed!")
    })

} 

遗憾的是,这不起作用。如果我用.reloadData()重新加载tableview,则显示按钮,告诉我Autolayout约束得到更新,但动画不会被触发。

1 个答案:

答案 0 :(得分:1)

使用自动布局制作动画时,必须使用layoutIfNeeded为约束中的更改设置动画。

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("VariationsTableViewCell", forIndexPath: indexPath) as! VariationsCell

    UIView.animateWithDuration(1.0, delay: 0.0, options: .CurveEaseOut) {
         cell.layoutIfNeeded()
    }

    return cell
}

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    let cell = tableView.dequeueReusableCellWithIdentifier("VariationsTableViewCell", forIndexPath: indexPath) as! VariationsCell

    cell.buttonRightSideConstraint.constant = -8

    tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: .None)
}