在 collectionView 的两个不同单元格中显示 highchart 和 swiftDataTable

Posted

技术标签:

【中文标题】在 collectionView 的两个不同单元格中显示 highchart 和 swiftDataTable【英文标题】:Display highchart and swiftDataTable in two different cells of a collectionView 【发布时间】:2018-11-28 08:19:56 【问题描述】:

我正在尝试在第一个 collectionViewCell 中为每个报告显示关联的图表(使用 HighChart),当您向右滑动时,您会在第二个 collectionViewCell 中获得关联的数据表(我使用 SwiftDataTables)。我遇到的问题最近三天一直面临的是,我无法使用

在 collectionviewCell 中显示它们中的任何一个

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell

这是我的代码:

1- collectionView 和 customCell 实例:

lazy var collectionView: UICollectionView = 
        let layout = UICollectionViewFlowLayout()
        layout.scrollDirection = .horizontal
        layout.minimumLineSpacing = 0
        let cv = UICollectionView(frame: .zero, collectionViewLayout: layout)
        cv.backgroundColor = .white
        cv.dataSource = self
        cv.delegate = self
        cv.isPagingEnabled = true

        return cv
    ()

var pages: [Page] = []

2-自定义 CollectionViewCell : PageCell

import UIKit
import Highcharts
import SwiftDataTables
import ChameleonFramework

class PageCell: UICollectionViewCell 

    var imageView: UIImageView = 
        let iv = UIImageView()
        iv.contentMode = .scaleAspectFill
        iv.backgroundColor = .yellow
        iv.image = UIImage(named: "background_2")
        iv.clipsToBounds = true
        return iv
    ()

    var pageView: UIView= 
        let pv = UIView()
        pv.contentMode = .scaleAspectFill
        pv.clipsToBounds = true

        return pv
    ()


    var page: Page? 
        didSet 
           // print(page?.mainView)

            guard let unwrappedPage = page else 
                return
            
            //imageView.image = UIImage(named: unwrappedPage.image)//unwrappedPage.image

            pageView = unwrappedPage.mainView
            imageView.image = UIImage(named: unwrappedPage.image)

            print("imageView.image: ", imageView.image)
            print("PageViewContent: ", pageView)
            print("unwrappedPage.mainView: ", unwrappedPage.mainView)
        
    


    override init(frame: CGRect) 
        super.init(frame: frame)

        setupViews()
    

    func setupViews() 

         addSubview(imageView)
         imageView.anchorWithConstantsToTop(top: topAnchor, left: leftAnchor, bottom: bottomAnchor, right: rightAnchor, topConstant: 70, leftConstant: 0, bottomConstant: 100, rightConstant: 0)



        addSubview(pageView)
        pageView.anchorWithConstantsToTop(top: topAnchor, left: leftAnchor, bottom: bottomAnchor, right: rightAnchor, topConstant: 70, leftConstant: 0, bottomConstant: 100, rightConstant: 0)


        //imageView.frame = CGRect(x: UIScreen.main.bounds.origin.x, y: UIScreen.main.bounds.origin.y+70, width: UIScreen.main.bounds.size.width, height: UIScreen.main.bounds.size.height-100)



    

    required init?(coder aDecoder: NSCoder) 
        fatalError("init(coder:) has not been implemented")
    


3- 自定义单元格的结构:页面

import Foundation

struct Page 
    let mainView: UIView
    let image: String

2 - 将 collectionView 添加到 View + 设置约束

 //TODO: collectionView Config
  self.view.addSubview(self.collectionView)
  self.collectionView.anchorToTop(top: self.view.topAnchor, left: 
  self.view.leftAnchor, bottom: self.view.bottomAnchor, right: 
  self.view.rightAnchor)
  self.collectionView.register(PageCell.self, forCellWithReuseIdentifier: "cellId")
 self.pages = 
          let firstPage = Page(mainView: self.chartView, image: "background_2")
          let secondPage = Page(mainView: self.chartView, image: "background_2")
           return [firstPage, secondPage]
                    ()

3-CollectionView 方法:

    //MARK: - UICollectionViewController Extension
extension SecondViewController: UICollectionViewDataSource, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout 



    //TODO: numberOfItemsInSection method
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int 
        return pages.count
    


    //TODO: cellForItemAt method
    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell 

        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cellId", for: indexPath) as! PageCell

        let page = pages[indexPath.item]

        cell.page = page

        return cell
    

    //TODO: collectionViewLayout method

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize 
        return CGSize(width: view.frame.width, height: view.frame.height)
    


    //TODO: scrollViewWillEndDragging method
    func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) 

        let x = targetContentOffset.pointee.x

        pageControl.currentPage = Int(x / view.frame.width)


    



知道对于 imageView 的情况,它工作得很好,我在关联的单元格中获取每个图像,但对于视图(chatyView 和数据表),它是一个空白区域,除非我在集合视图之后添加它们:

self.collectionView.addSubview(self.chartView)

self.chartView.anchorWithConstantsToTop(top: self.view.topAnchor, left: self.view.leftAnchor, bottom: self.view.bottomAnchor, right: self.view.rightAnchor, topConstant: 50, leftConstant: 0, bottomConstant: 20, rightConstant: 0)  


self.collectionView.addSubview(self.dataTable) 

self.dataTable.anchorWithConstantsToTop(top: self.view.topAnchor, left: self.view.leftAnchor, bottom: self.view.bottomAnchor, right: self.view.rightAnchor, topConstant: 70, leftConstant: 0, bottomConstant: 20, rightConstant: 0)

这是唯一有效的情况,但它不能满足我的需要,因为它们在每个单元格中显示在另一个的顶部:/。

到目前为止我已经尝试过但对我不起作用:

我没有使用 PageCell 作为自定义单元格,而是使用 UICollectionViewCell,并且我通过使用 append 创建了一个 UIView 数组,我添加了视图并尝试使用 itemForCellAtIndexpath 方法将它们分配给适当的单元格。没有工作。

我使用的是 cell.contanView.addSubView() 而不是 cell = page[indexPath.item]。也没有幸运。

还尝试使用 UIView 的 Array 的位置来使用特定类型,例如 HiChartView/SwiftDatable。但没用。

我发现奇怪的是它与 UIImageView 完美配合,但不适用于图表或 dataTable,除非我在 collectionView 配置之后添加它们。

提前致谢(y)

【问题讨论】:

【参考方案1】:

我通过删除:

self.dataTable.anchorWithConstantsToTop(top: self.view.topAnchor, left: self.view.leftAnchor, bottom: self.view.bottomAnchor, right: self.view.rightAnchor, topConstant: 70, leftConstant: 0, bottomConstant: 20, rightConstant: 0)

而是添加:

self.dataTable.frame = CGRect(x: self.frame.origin.x, y: self.frame.origin.y, width: self.frame.size.width, height: self.frame.size.height)

chartView 也一样。

【讨论】:

以上是关于在 collectionView 的两个不同单元格中显示 highchart 和 swiftDataTable的主要内容,如果未能解决你的问题,请参考以下文章

重新排序 CollectionView 单元格 iOS 11

一个 tableView 单元中的两个 collectionView。 collectionViews 没有出现

collectionview 单元格中的阴影与 swift 中的其他单元格的行为方式不同

不同笔尖的collectionView单元格宽度不会改变

一个 collectionView 中的不同类型的单元格

如何在水平collectionview中设置不同的单元格高度和宽度