使用 flowLayout 自行调整大小的 collectionView

Posted

技术标签:

【中文标题】使用 flowLayout 自行调整大小的 collectionView【英文标题】:self sizing collectionView with flowLayout 【发布时间】:2017-07-29 19:16:29 【问题描述】:

当我在没有

的情况下使用 collectionView
let flowLayout = collectionView.collectionViewLayout as!  UICollectionViewFlowLayout 
flowLayout.estimatedItemSize = CGSize (width: self.collectionView.frame.width, height: 100) 

然后显示所有单元格,但是当我使用 flowLayout 时,单元格不显示我已经在这里坐了一个星期,无法理解为什么会这样。

这是我的代码

override func viewDidLoad() 
    super.viewDidLoad()

    collectionView.delegate = self
    collectionView.dataSource = self

    let flowLayout = collectionView.collectionViewLayout as! UICollectionViewFlowLayout

    flowLayout.estimatedItemSize = CGSize(width: self.collectionView.frame.width, height: 100)



    requestD(url: url)



// MARK: UICollectionViewDataSource

func numberOfSections(in collectionView: UICollectionView) -> Int 
    return 1



func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int 
    return modals.count


func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell 
    if modals.count == 0 
        return UICollectionViewCell()
    
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! CollectionViewCellAudio


    cell.name?.text = modals[indexPath.row].name


    let u = URL(string: "http://www.---.com" + (modals[indexPath.row].ImageViewURL))
    cell.ImageView.sd_setImage(with: u, placeholderImage: UIImage(named: "white"),
                               options: [.continueInBackground,.scaleDownLargeImages])  (image, error, cacheType, url) in

                                self.modals[indexPath.row].ImageView = cell.ImageView.image!

      

    return cell  


func requestD(url:String)


    var urlRequest = URLRequest(url: URL(string: url)!)
    urlRequest.timeoutInterval = 300



    let task = URLSession.shared.dataTask(with: urlRequest)  (data,response,error) in

        if error != nil
            print(error ?? 0)
            return
        
        do
            let json = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as! [String : Any]

            if let main = json["LIBRARY"] as? [String:[String : Any]]

                for (_, data) in main 
                    let info = ModalAudio()
                    info.id = data["ID"] as? String
                    info.name = data["NAME"] as? String
                    info.AboutBook = data["DETAIL_TEXT"] as? String
                    info.ImageViewURL = data["PICTURE"] as! String

                    self.modals.append(info)


                
            

         catch let error 
            print(error)
        

        DispatchQueue.main.sync 

            self.isMoreDataLoading = false
            self.iNumPage += 1

        
    

    self.collectionView?.reloadData()
    task.resume()


【问题讨论】:

【参考方案1】:

viewDidLoad 中,您的集合视图的框架尚未定义,因此请将此代码放入您的viewDidLayoutSubView 方法中,在查看您的项目后,您的问题与flowLayout.estimatedItemSize 的使用有关,您可以在属性中阅读声明注释

@available(ios 8.0, *)
open var estimatedItemSize: CGSize // defaults to CGSizeZero - setting a non-zero size enables cells that self-size via -preferredLayoutAttributesFittingAttributes:

所以使用这段代码,它可以工作

    override func viewDidLayoutSubviews() 
            super.viewDidLayoutSubviews()
            let flowLayout = collectionView.collectionViewLayout as! UICollectionViewFlowLayout

            //flowLayout.estimatedItemSize = CGSize(width: self.collectionView.frame.width, height: 100) don't show your cells
            flowLayout.itemSize = CGSize(width: self.collectionView.frame.width, height: 100)//show your cells
            flowLayout.invalidateLayout() 
        

希望对你有帮助

【讨论】:

@Vasya2014 是一个真实的项目还是示例?你能把你的项目发布到 github 上进行审核吗? 这是一个项目。我可以在几个小时内制作一个示例项目。方便吗? @Vasya2014 完美,我要睡觉了,如果你给我发个例子,我会检查并解决这个问题,我会在 7 小时内回来 CollectionViewController 在我使用 flowLayout 时不想显示单元格,所以一切正常 显示单元格,但大小不会根据文本而改变,约束从顶部放下

以上是关于使用 flowLayout 自行调整大小的 collectionView的主要内容,如果未能解决你的问题,请参考以下文章

使用 CSS 与使用 cols 和 rows 调整 textarea 的大小

Bootstrap动态col调整大小[重复]

FlowLayout 的意外行为

无法使用自动布局将简单的自行调整大小的集合视图单元格调整为标签大小

如何使用 FlowLayout 确定 UICollectionView 的高度

UICollectionView 内容未正确调整大小