2015-06-09 4 views
2

У меня есть подкласс UITableviewCell, который содержит UIButton, который помещен за пределы экрана (справа) с горизонтальным пространственным ограничением автолоката до его надзора -312.UIView.animateWithDuration не работает в UITableviewCell

Теперь я хочу анимировать это ограничение до значения -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!") 
    }) 

} 

К сожалению, это не работает. Если я перезагружу tableview с помощью .reloadData(), отобразится кнопка, которая сообщает мне, что ограничение Autolayout обновляется, но анимация не запускается.

ответ

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) 
} 
+0

Я бы не рекомендовал использовать автоматическую компоновку на ячейках таблицы. Всякий раз, когда вы называете 'layoutIfNeeded' в вашем представлении контроллера/таблицы, ваша ячейка ** может ** показывать какое-то нежелательное поведение. – Eendje

+0

self.layoutIfNeeded приводит к ошибке «ViewController» не имеет члена с именем «layoutIfNeeded». Вы имели в виду cell.layoutIfNeeded()? Я уже пробовал это, и он не работает. – Mars

+0

Да, извините, забыли добавить это. Также, если вы используете автоматическую компоновку в ячейке, вы должны добавить subviews в 'contentView'. – Eendje

Смежные вопросы