转换到横向后如何更新 UITableViewCell 内的 UICollectionView
Posted
技术标签:
【中文标题】转换到横向后如何更新 UITableViewCell 内的 UICollectionView【英文标题】:How to update UICollectionView inside UITableViewCell after transition to landscape 【发布时间】:2020-05-28 13:49:28 【问题描述】:我有以下collectionView:https://youtu.be/dY2MDeFINEY
我希望图像在横向转换期间保持居中,甚至 collectionView 的“分页行为”也应该保留。 为了实现这一点,我尝试了几件事。我当前的代码(仅用于过渡)如下所示:TableViewController 的代码,其中包含 TableViewCell 和 collectionView:
...
override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator)
super.viewWillTransition(to: size, with: coordinator)
let indexPath = IndexPath(row: 1, section: 0)//The position of the row doesn't change
let cell = tableView.cellForRow(at: indexPath) as? PlantDetailImageTableViewCell
tableView.reloadData()
cell?.respondToTransition()
...
respondToTransition 方法(在包含 collectionView 的 TableViewCell 内部)如下所示:
func respondToTransition()
collectionView.collectionViewLayout.invalidateLayout()
let indexPath = IndexPath(item: pageControl.currentPage, section: 0)
DispatchQueue.main.async
self.pageControl.currentPage = indexPath.row
self.collectionView.scrollToItem(at: indexPath, at: .centeredHorizontally, animated: true)
我的流程布局如下:
extension PlantDetailImageTableViewCell: UICollectionViewDelegateFlowLayout
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize
return collectionView.frame.size
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat
return 0
func scrollViewDidEndDecelerating(_ scrollView: UIScrollView)
pageControl.currentPage = Int(self.collectionView.contentOffset.x / self.collectionView.frame.size.width)
过渡到横向的结果如下:https://youtu.be/RlTX0LgfKEY
如何强制图像保持居中。此外,collectionView 似乎“丢失”了一些“分页行为”。 Xcode 的视图调试器显示以下横向(标记为蓝色的是 collectionView 单元格内的图像视图):
感谢任何帮助!
编辑: 只有当我尝试从纵向变为横向时,才会出现问题。因此,如果我以横向方式启动应用程序,那么一切都会按预期运行。
【问题讨论】:
也许只是关于单元格的 imageView 的Content Mode
?您对此有何配置?
@emrcftci 不,它设置为 .aspectFit。只有当我尝试从纵向变为横向时,才会出现问题。所以如果我从风景开始,那么一切都会按预期进行......
@finebel 您需要在 viewWilTransition 方法中使布局无效,而不是 reloadData
@LeoDabus 你指的是哪个布局(我应该调用哪个方法而不是 tableView.reloadData() )?
collectionViewLayout.invalidateLayout()
【参考方案1】:
我想出了解决问题的办法。
正如 LeoDabus 在评论部分提到的,在 TableViewController 中调用 tableView.reloadData()
是不必要的。所以我删除了这个,此外,我将respondToTransition()
更改为以下内容:
func respondToTransition()
collectionView.collectionViewLayout.invalidateLayout()
let indexPath = IndexPath(item: pageControl.currentPage, section: 0)
DispatchQueue.main.async
self.collectionView.reloadData()//!!!
self.pageControl.currentPage = indexPath.row
self.collectionView.scrollToItem(at: indexPath, at: .centeredHorizontally, animated: true)
我的流程布局还是一样...
【讨论】:
以上是关于转换到横向后如何更新 UITableViewCell 内的 UICollectionView的主要内容,如果未能解决你的问题,请参考以下文章
如何固定table的第一行,不随纵向滚动条滚动,但能横向滚动
如何将左连接横向 SQL 查询转换为 Laravel Eloquent 查询?