UITableView 上的 UIButton 高度未正确设置

UIButton height not being set correctly on UITableView

我有一个 UITableView,其中包含一个项目列表。对于 table 中的每个 UITableViewcell,取决于从关联对象到该单元格的 属性,我通过将高度约束常量更改为 0 来切换 UIButton 的可见性,或定义为使其可见的值。我已经检查了 Xcode 设计器上那个按钮的 Clip to Bounds 选项。

如果我向 table 视图提供一个项目列表,将一些按钮设置为可见,将其他设置为 隐藏 并滚动,使按钮可见的单元格可能隐藏,反之亦然。当带有按钮的单元格很少而其余单元格没有按钮时,这会更加明显。

包含 显示隐藏 逻辑的方法 UIButton 来自 UITableViewCell为单元格自定义class,如下:

public partial class UITableViewCellCustom : UITableViewCell
{
    public Object obj;

    public void SetObject(Object obj)
    {
        // Do something with obj...

        // Do something with the obj that determines if the buttons should be collapsed or not
        Boolean collapseButton = ...;

        ToggleButtonVisibility(collapseButton);
    }

    private void ToggleButtonVisibility(Boolean collapse) 
    {
        NSLayoutConstraint uiButtonCancelHeightConstraint = UIButtonCancel.Constraints
            .FirstOrDefault(query => query.FirstItem == UIButtonCancel
                                  && query.FirstAttribute == NSLayoutAttribute.Height);
                                  
        NSLayoutConstraint uiButtonCancelTopConstraint = this.ContentView.Constraints
            .FirstOrDefault(query => query.FirstItem == UIButtonCancel
                                  && query.FirstAttribute == NSLayoutAttribute.Top);

        if (collapse)
        {
            uiButtonCancelHeightConstraint.Constant = 0;
            uiButtonCancelTopConstraint.Constant = 0;
        }
        else
        {
            uiButtonCancelHeightConstraint.Constant = 30;
            uiButtonCancelTopConstraint.Constant = 10;
        }
    }
}

SetObject 方法从 UITableViewSource class 调用,从正确的索引获取对象并将其设置到单元格(这里没问题)。然后,当一些 UILabels 文本被对象的值更改时,我检查是否需要按钮(这里没问题)。当我调用 ToggleButtonVisibility 方法并尝试更改两个约束 - heighttop - 应用值, top 约束明显改变,但 height 约束似乎在重用单元格时被忽略。

我试图将 ClipToBounds 强制为 true,强制在主线程中使用该方法,但其中 none 有效。我在这里错过了什么?


忘记提及: 当按下按钮时,table 视图被清除(我为源提供一个空列表,并重新加载数据),一个执行长任务,然后将新列表应用于 table,但有问题的单元格仍带有按钮 bugged.


备注:

通过将 UIButton 包装在 UIView 上然后根据我的需要调整视图大小解决了这个问题。