【问题标题】:How to Change UITableViewCell's Height on Tap?如何在点击时更改 UITableViewCell 高度?
【发布时间】:2015-09-22 13:28:00
【问题描述】:

每当点击特定单元格时,我试图让 UITableViewCell 显示有关特定单元格的更多内容。一旦单元格膨胀并再次被轻敲,单元格应收缩回其原始大小。

我很确定必须对代表 heightForRowAtIndexPathdidSelectRowAtIndexPath 做一些事情,但我不知道如何使用 didSelectRowAtIndexPath 选择特定的表格单元格行。

// Height of table cell rows
func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
    return 45
}

//On cell tap, expand
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    self.tableView.rowHeight = 75;
}

另外,是否可以隐藏从父单元格溢出的任何内容?有点像溢出:隐藏;在 CSS 中。

【问题讨论】:

    标签: ios swift uitableview cocoa-touch delegates


    【解决方案1】:

    声明一个全局变量 NSInteger 类型并将 row 存储在 didSelectRowAtIndexPath 中选择的 tableview 上,并在此处重新加载。检查 heightForRowAtIndexPath 中的行并增加那里的高度。 像这样试试

    var selectedIndex : NSInteger! = -1 //Delecre this global 
    
     func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        if indexPath.row == selectedIndex{
            selectedIndex = -1
        }else{
            selectedIndex = indexPath.row
        }
        tableView.reloadData()
    }
    
    func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
        if indexPath.row == selectedIndex
        {
            return 75
        }else{
            return 45
        }
    }
    

    【讨论】:

    • 请注意,与 Fayza 的回答不同,您不会使用此解决方案获得任何动画
    【解决方案2】:

    你要做的就是在 didSelectRow 方法中保存所选 Cell 的索引。并且还必须开始/结束表格视图的更新。这将重新加载 tableview 的某些部分。并将调用 heightForRow 方法。在该方法中,您可以检查如果您的行被选中,则返回expandedHeight,否则返回正常高度

    行高:

    func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
    
        if self.selectedSortingRow == indexPath.row {
            return ExpandedRowHeight
        }
        else{
            return normalHeight
        }
    }
    

    在 didSelect 行中:

    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    
        self.tableView.beginUpdates()
        selectedSortingRow = (int) indexPath.row        
        self.tableView.endUpdates()
    }
    

    【讨论】:

    • 如果你没听明白请告诉我
    • 知道了,这个答案和其他答案对你有很大帮助,谢谢!
    • 请注意,您不必保存自己的变量来跟踪它,因为表格视图通过tableView.indexPathForSelectedRow跟踪其选定的索引路径
    • 我已经这样做了,但由于某种原因它没有动画。它使它变大,但不执行任何动画。
    • 我正在使用 collectionView 进行此操作
    【解决方案3】:

    Swift 4 答案与推荐的 cmets。无需创建新变量,tableView 保存 selectedRow indexPath 的值。

     override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
            self.tableView.beginUpdates()
            self.tableView.endUpdates()
        }
    
    override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        if self.tableView.indexPathForSelectedRow?.row == indexPath.row {
            return 75;
        } else {
        return 45;
        }
    }
    

    【讨论】:

      【解决方案4】:

      Swift 4. 多选动画调整大小。基于 Ryderpro 的回答。

      override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
          tableView.beginUpdates()
          tableView.endUpdates()
      }
      
      override func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
          tableView.beginUpdates()
          tableView.endUpdates()
      }
      
      override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
          if let selectedRows = tableView.indexPathsForSelectedRows, selectedRows.contains(indexPath) {
              return 75
          } else {
              return 45
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-15
        • 2014-11-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多