转换到横向后如何更新 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的主要内容,如果未能解决你的问题,请参考以下文章

将应用程序转换为 IPAD 时如何保持横向或纵向模式?

如何固定table的第一行,不随纵向滚动条滚动,但能横向滚动

如何在 Xcode 4 中将视图转换为横向模式

如何将左连接横向 SQL 查询转换为 Laravel Eloquent 查询?

将检测到的矩形从纵向 CIImage 转换为横向 CIImage

将 UIView 坐标转换为横向