IOS UITableView 显示数组的前 5 行

IOS UITableView display first 5 rows of an array

我有一个包含 1 个单元格的 UITableView,加载数组时我只想让用户看到前 5 行的内容并模糊其余部分。因此,如果有一个包含 20 项的数组,则前 5 项需要可见,其余 15 项需要模糊。使用下面的代码,我只能向第 5 行添加模糊,我无法弄清楚。非常感谢任何帮助。

ViewController

let visualEffectView = UIVisualEffectView(effect: UIBlurEffect(style: .light))



    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return array.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! CustomTableViewCell
        cell.cellLbl?.text = array[indexPath.row]

        if indexPath.row == 5 {
            visualEffectView.frame = cell.bounds
            visualEffectView.layer.masksToBounds = true
            cell.addSubview(visualEffectView)
        }
        return cell
    } 

您不能共享在单元格之间移动的单个视觉效果视图。 (一个视图在 w 视图层次结构中只能存在一次。如果您将它作为子视图添加到 2 个位置,它将从第一个位置被删除)。

您的代码也应该使用 if indexPath.row >= 5,而不是 if indexPath.row == 5

我建议创建一个具有 public blurView IBOutlet 的 UICollectionViewCell 的自定义子类。在 XIB/storyboard 的单元格中安装模糊视图。在您的 tableView(_:cellForRowAt:) 方法中,如果行小于 5,则隐藏模糊视图,否则取消隐藏它。

发生这种情况的原因有很多。

  1. 您似乎在视图控制器中分配了一个模糊视图实例。这没有意义,因为你需要 N 个模糊视图,因为你想为每行添加一个模糊视图 >= 5.
  2. 即使您有多个模糊视图实例,您的逻辑也会专门检查是否 indexPath.row == 5。你会希望它是 indexPath.row >= 5.

要解决此问题,我建议您采取以下措施:

  1. 将 blurView 属性 添加到 CustomTableViewCell。这将确保每个单元格都有自己的模糊视图实例。确保将此模糊视图添加为内容视图的最顶层子视图并覆盖整个内容视图。确保此子视图默认隐藏。
  2. CustomTableViewCell 中,覆盖 prepareForReuse 并设置 blurView.isHidden = true
  3. 在您的 tableView(_:cellForRowAt:) 方法中,设置 cell.blurView.isHidden = indexPath.row >= 5

因为您正试图将单个 visualEffectView 变量添加到多个单元格。尝试像这样修复您的 cellForRowAt 方法:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! CustomTableViewCell
    cell.cellLbl?.text = array[indexPath.row]
    
    if indexPath.row >= 5 {
      let visualEffectView = UIVisualEffectView(effect: UIBlurEffect(style: .light))
      visualEffectView.frame = cell.bounds
      visualEffectView.layer.masksToBounds = true
      cell.addSubview(visualEffectView)
    }
    return cell
  }