【问题标题】:UIButton height not being set correctly on UITableViewUITableView 上的 UIButton 高度未正确设置
【发布时间】:2017-12-05 16:38:11
【问题描述】:

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

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

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

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

我尝试将ClipToBounds 强制为true,强制在主线程中使用该方法,但它们都不起作用。我在这里错过了什么?


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


注意事项:

  • 通过将Alpha 更改为0 或将Hidden 设置为true 来隐藏按钮不是一种选择,因为它会在tableview 中留下一个

【问题讨论】:

  • 您是否需要更改约束来切换可见性?你不能只改变按钮的 Alpha 或 Hidden 标志吗?
  • 我同意@lowleetak 为什么不设置alpha = 0hidden = true 来隐藏按钮?
  • @lowleetak 不幸的是,如果我通过更改 Alpha / Hidden 标志来切换可见性,列表中将包含 holes,所以它不是一个选项。
  • 另外,您尝试更新 UITableView 的数据并调用 tableView.ReloadData 或 tableView.RemoveRow?修改约束仍会将单元格留在 TableView 中,并且您可能仍会显示 TableView 分隔符。
  • 我尝试将一个空数组提供给表格视图,重新加载数据,然后提供“实时”数据并再次重新加载,以确保所有数据和行都已更新。它仍然在发生。

标签: ios uitableview xamarin.ios uibutton nslayoutconstraint


【解决方案1】:

通过将UIButton 包裹在UIView 上,然后根据我的需要调整视图大小来解决此问题。

【讨论】:

  • 我也有同样的问题,解决方法太难过了:(
猜你喜欢
  • 2012-05-31
  • 2011-06-17
  • 2015-06-06
  • 1970-01-01
  • 1970-01-01
  • 2018-04-03
  • 1970-01-01
  • 2015-06-12
  • 1970-01-01
相关资源
最近更新 更多