使用 flowLayout 自行调整大小的 collectionView
Posted
技术标签:
【中文标题】使用 flowLayout 自行调整大小的 collectionView【英文标题】:self sizing collectionView with flowLayout 【发布时间】:2017-07-29 19:16:29 【问题描述】:当我在没有
的情况下使用 collectionViewlet 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 的大小
无法使用自动布局将简单的自行调整大小的集合视图单元格调整为标签大小