gpt4 book ai didi

ios - TableView中的动态collectionView

转载 作者:行者123 更新时间:2023-12-01 16:01:15 26 4
gpt4 key购买 nike

我在TableView中有一个动态collectionView,出现三个错误:

  • 应用程序启动时单元格显示不正确
  • 当我做 inserItem单元格闪烁,好像正在重新启动
  • 最重要的是collectionView.insertItems前四个单元格被隐藏,video

    谢谢

  • 主视图 Controller
    class ViewController: UIViewController, UIScrollViewDelegate {


    override func viewDidLoad() {
    super.viewDidLoad()
    setting()
    }

    func setting(){

    getData()

    tableView.dataSource = self
    tableView.delegate = self

    tableView.estimatedRowHeight = UITableView.automaticDimension
    tableView.rowHeight = UITableView.automaticDimension

    }

    //load data
    func pagination(_ completion: (()->())?){

    SmartNetworkSevrice.getGoods(with: url) { [unowned self] (data) in
    guard data.modals.count > 0 else {
    self.tableView.tableFooterView = nil
    return
    }

    self.goods.append(contentsOf: data.modals)
    self.offSet += data.modals.count
    DispatchQueue.main.async {
    let indexPath = IndexPath(row: 0, section: 0)
    self.tableView.tableFooterView = nil
    if self.goods.count == data.modals.count || self.isRefresh {
    self.tableView.reloadRows(at: [indexPath], with: .none)
    } else {
    if let cell = self.tableView.cellForRow(at: indexPath) as? TVCellGoods {
    UIView.performWithoutAnimation {
    self.tableView.beginUpdates()
    cell.insertGoods(data.modals)
    cell.layoutIfNeeded()
    cell.collectionViewHeight.constant = cell.collectionView.collectionViewLayout.collectionViewContentSize.height
    self.tableView.endUpdates()
    }

    }
    }
    completion?()
    }
    }

    // define bottom of tableView
    func scrollViewDidScroll(_ scrollView: UIScrollView) {

    guard scrollView == self.tableView else { return }
    if (!isMoreDataLoading) {

    // Вычислить позицию длины экрана до нижней части результатов
    let scrollViewContentHeight = scrollView.contentSize.height
    let scrollOffsetThreshold = scrollViewContentHeight - scrollView.bounds.size.height
    if(scrollView.contentOffset.y > scrollOffsetThreshold && scrollView.isDragging) {
    isMoreDataLoading = true
    self.tableView.isScrollEnabled = false;
    self.tableView.isScrollEnabled = true;
    pagination(nil)
    }
    }

    }

    }

    extension ViewController: UITableViewDataSource {


    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return 1
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    guard let cell = tableView.dequeueReusableCell(withIdentifier: "goods", for: indexPath) as? TVCellGoods else { return UITableViewCell() }
    guard bestGoods.count != 0, goods.count != 0 else { return UITableViewCell() }
    cell.delegate = self
    cell.configure(bestGoods, goods, categories)
    // автообновление высоты
    self.tableView.beginUpdates()
    cell.collectionViewHeight.constant = cell.collectionView.collectionViewLayout.collectionViewContentSize.height
    self.tableView.endUpdates()
    return cell
    }

    }

    extension ViewController: UITableViewDelegate, CallDelegate {

    func callMethod() {}

    func callMethod(push vc:UIViewController) {
    self.navigationController?.pushViewController(vc, animated: true)
    }

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

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

    }

    TableViewCell 与 collectionView
    class TVCellGoods: UITableViewCell {

    @IBOutlet weak var collectionView:UICollectionView!
    @IBOutlet weak var collectionViewHeight:NSLayoutConstraint!

    weak var delegate:CallDelegate?
    var bestGoods = [Goods]() // лучшие товары
    var goods = [Goods]() // все товары
    var categories = [Menu]()

    override func awakeFromNib() {
    super.awakeFromNib()

    collectionView.delegate = self
    collectionView.dataSource = self
    collectionView.tag = 2
    collectionView.isScrollEnabled = false

    }

    override func setSelected(_ selected: Bool, animated: Bool) {
    super.setSelected(selected, animated: animated)

    // Configure the view for the selected state
    }

    func configure(_ best:[Goods],_ goods:[Goods], _ category:[Menu]) {

    self.bestGoods = best
    self.goods = goods
    self.categories = category
    self.collectionView.reloadData()

    }

    func insertGoods(_ data:[Goods]) {

    self.goods.append(contentsOf: data)
    let count = self.bestGoods.count + self.categories.count + self.goods.count
    let indexPaths = ((count - data.count) ..< count)
    .map { IndexPath(row: $0, section: 0) }
    self.collectionView.performBatchUpdates({
    self.collectionView.insertItems(at: indexPaths)
    }, completion: nil)

    }

    }

    和 CollectionViewCell
    class CVCellGoods: UICollectionViewCell {

    @IBOutlet weak var bgView: UIView!
    @IBOutlet weak var imageView: UIImageView!
    @IBOutlet weak var title: UILabel!
    @IBOutlet weak var price: UILabel!
    @IBOutlet weak var delivery: UIImageView!
    @IBOutlet weak var premium: UIImageView!

    override func prepareForReuse() {
    super.prepareForReuse()
    delivery.image = nil
    premium.image = nil
    title.text = nil
    price.text = nil
    imageView.image = nil
    imageView.sd_cancelCurrentImageLoad()
    }

    override func awakeFromNib() {
    super.awakeFromNib()

    imageView.backgroundColor = UIColor(red: 215/255, green: 215/255, blue: 215/255, alpha: 1)

    self.contentView.layer.cornerRadius = 5
    self.contentView.layer.masksToBounds = true

    self.layer.shadowColor = UIColor.black.cgColor
    self.layer.shadowOffset = CGSize(width: 0, height: 0.5)
    self.layer.shadowRadius = 1
    self.layer.shadowOpacity = 0.3
    self.layer.masksToBounds = false
    self.layer.shouldRasterize = true
    self.layer.rasterizationScale = UIScreen.main.scale

    }

    }

    编辑:这在启动时会出现一个小错误

    TVCellGoods.swift
    override func layoutSubviews() {
    super.layoutSubviews()
    self.collectionView.collectionViewLayout.invalidateLayout()
    }


    enter image description here

    最佳答案

    我刚刚想出了如何解决你的问题。
    您将不得不使您的 Collection View 布局无效,因为您在 tableView 中使用 collectionView 只需在 TVCellGoods.swift 上添加以下方法

    override func layoutSubviews() {
    super.layoutSubviews()
    self.collectionView.collectionViewLayout.invalidateLayout()
    }

    我测试了它,并且工作!
    video

    关于ios - TableView中的动态collectionView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61162722/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com