首页 > 解决方案 > 为 UITableView 启用分页时重新加载表后 UITableViewCell 的奇怪行为

问题描述

我有一个UITableView和里面UITableViewCell,我添加了视图并尝试根据屏幕高度或UITableView's设置该视图的高度或单元格的高度height。最初,我能够做到这一点,但是在viewWillAppear重新加载表中时,无法为该视图或单元格的高度设置正确的高度。是身高问题还是其他问题,无法识别。任何帮助将不胜感激,并感谢您的回复。问题的标题可能令人困惑,或者您是否发现任何不相关的代码,然后欢迎提出建议(编辑)。

代码:

import UIKit

class PageViewController: UIViewController {
    @IBOutlet weak var tblPager: UITableView!
    let screenHeight = UIScreen.main.bounds.size.height
    
    let vColors: [UIColor] = [.red, .blue, .orange, .brown, .cyan, .darkGray, .green, .red, .blue, .orange, .brown, .cyan, .darkGray, .green]

    var pageSizeHeight: CGFloat = 0

    override func viewDidLoad() {
        super.viewDidLoad()

        pageSizeHeight = screenHeight - (getTopSafeArea() + getBottomSafeArea() + 54)
    }
   
    override func viewWillAppear(_ animated: Bool) {
        
        super.viewWillAppear(animated)
        
        delay(interval: 10.0) {
            
            print("Reload table after 10 seconds")
            self.tblPager.reloadData()
        }
    }
    
}

//MARK:- TableView Delegate
extension PageViewController: UITableViewDelegate, UITableViewDataSource {
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return vColors.count
    }
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "PageCell", for: indexPath) as! PageCell
        cell.backgroundColor = vColors[indexPath.row]
        
        cell.viewHeight.constant = pageSizeHeight
        return cell
    }
    
}

class PageCell: UITableViewCell {
    @IBOutlet weak var vwPage: UIView!
    @IBOutlet weak var viewHeight: NSLayoutConstraint!
}

func getTopSafeArea() -> CGFloat {
    let window = UIApplication.shared.keyWindow
    let topPadding = window?.safeAreaInsets.top ?? 0
    return topPadding
}

func getBottomSafeArea() -> CGFloat {
    let window = UIApplication.shared.keyWindow
    let bottomPadding = window?.safeAreaInsets.bottom ?? 0
    return bottomPadding
}

func delay(interval: TimeInterval, closure: @escaping () -> Void) {
    DispatchQueue.main.asyncAfter(deadline: .now() + interval) {
        closure()
    }
}

在此处输入图像描述

输出:

在此处输入图像描述

标签: iosswiftuitableview

解决方案


将其链接到 tableView 的高度,您的表格视图具有您需要的所有尺寸。

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) {
   // ...
   cell.viewHeight.constant = tableView.frame.size.heigh
   // ...
}

或删除viewHeight约束并使用委托方法设置行高

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
   return tableView.frame.size.height
}

升级版:

TableViewestimatedRowHeight用于计算其滚动偏移量。如果我们启用了分页但未配置,这确实会在重新加载期间产生问题estimatedRowHeight

解决方案 1: 实现estimatedHeightForRowAt委托

func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
     return tableView.frame.size.height
}

解决方案 2: 设置tableView.estimatedRowHeight = 0和使用heightForRowAt委托而不是viewHeight约束


推荐阅读