约束不断变化,但布局没有更新?

时间:2016-10-25 05:41:05

标签: swift layout tableview views cell

我有一个奇怪的问题:在我的表视图中,我希望在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等方法:无效。布局没有更新的原因是什么?我应该在layoutupdate方法上调用什么?我一直在self.view上给他们打电话,但如果你想尝试更新广告的布局,我甚至不确定你是否应该在视图上调用它表格视图单元格。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

我明白了。问题本身就是约束。因为我正在访问错误的一个。我将其定义为saveButtonTrailingConstraint,但实际上我修改的是saveButton的宽度约束(显然无法设置动画)。而不是访问saveButton.constraints[indexOfTrailingConstraint]我应该定义saveButton.superview!.constraints[indexOfTrailingConstraint]因为约束属于superview而不是按钮本身。我想从这个笨拙的错误中解脱出来的最好的事情就是总是仔细检查你是否正在以编程方式修改正确的约束,因为它并不总是显示在第一只眼睛上。