我有一个奇怪的问题:在我的表视图中,我想在其UISlider
被修改时更新单个单元格(值更改控制事件)。当滑块的值发生变化时,我想将一个按钮动画化到单元格中(从右侧滑动)。我将按钮的约束常数设置为-50,以确保默认情况下它不可见,当滑动条的值发生变化时,调用更新表视图的方法,因此cellForRowAtIndexPath
再次被调用为我的表中的所有单元格。简化后看起来像这样:
func valueChanged(sender:UISlider) {
// Reload table view
self.myTableView.reloadData()
// Let table view know the value of the slider got modified
self.didChangeValueOfSlider = true
}
在cellForRowAtIndexPath
中,我通过使用自定义selectedCellIndexPath
变量来跟踪哪个单元格的滑块发生了变化。当表视图到达被修改的单元格时,它运行以下代码:
// Check if cell is selected
if indexPath == self.selectedCellIndexPath {
// Check if value of slider was changed
if self.didChangeValueOfSlider == true {
// Value was changed: set constraint back to default
saveButtonTrailingConstraint.constant = CGFloat(15)
self.view.setNeedsUpdateConstraints()
self.view.updateConstraintsIfNeeded()
// Reset slider update status
self.didChangeValueOfSlider = false
}
}
调用那些setNeedsUpdateConstraints()
和updateConstraintsIfNeeded()
可能是过度的或不必要的,但请注意,这是我第15次尝试左右,以实际获得视图显示更新的布局。我使用断点来确认常量的实际变化,在上面的代码完成运行之后,一切都工作得很好。我唯一不能用的是更新部分。我已经尝试了UIView.animateWithDuration
动画的变化,我已经尝试了方法,如layoutIfNeeded()
和beginUpdates()
和endUpdates
的表视图:没有工作。布局没有更新的原因是什么?我应该在layout
和update
方法上调用什么?我一直在self.view
上调用它们但我甚至不确定你是否应该在视图上调用它如果你试图更新表视图单元格的布局。
我明白了。问题原来是约束本身。因为我进入了错误的网站我将其定义为saveButtonTrailingConstraint
,但我实际上修改的是saveButton
的宽度约束(显然不能动画)。而不是访问saveButton.constraints[indexOfTrailingConstraint]
,我应该定义saveButton.superview!.constraints[indexOfTrailingConstraint]
作为约束属于父视图,而不是按钮本身。我想从这个笨拙的错误中吸取的最好的事情是总是仔细检查你是否修改了正确的约束,如果你是通过编程来做的,因为它并不总是在第一眼上显示。