iOS 用 UICollectionView 如何实现这种布局

Posted

技术标签:

【中文标题】iOS 用 UICollectionView 如何实现这种布局【英文标题】:iOS with UICollectionView how to achieve this type of layout 【发布时间】:2019-03-18 09:53:21 【问题描述】:

要求:

如果左视图可见或不可见,我应该能够滚动整个视图(如果我滚动视图中的任何位置,所有组件都应该一次滚动)。 通过点击显示/隐藏左视图按钮按钮,它应该能够隐藏或显示左视图。 在单元格中(只有单元格不是左视图)有展开/折叠功能(我可以增加/减少单元格高度) 如果我在设备设置应用程序中更改字体大小,它也应该在这里生效(所以支持动态字体大小)

我尝试过的:

我尝试过使用 tableview、滚动视图但没有运气。最后想尝试使用集合视图,任何人都可以帮我解决如何继续使用集合视图。如果我们将来使用集合视图,我们会遇到任何复杂情况。

【问题讨论】:

当单元格滚动时,左视图是否应该保持原位? 不,整个视图应该滚动(HeaderView, LeftView, cells) 您能分享一下您计划在左侧使用的视图类型吗?所以也许用一个单一的表格视图就可以实现。 听起来你需要自定义 UICollectionView 布局。 @MuhammadZohaibEhsan: 左视图 - 在这种情况下包含多个选项我打算使用 tableview,因为它包含许多选项但禁用滚动(这样无论我在哪里滚动它都会滚动整个视图) 【参考方案1】:

最佳方法。

    您的 UI 层次结构应该是这样的。

堆栈视图

集合视图

表格视图

注意:您可以同时使用CollectionViewTableView,但我更喜欢两者不同,这样我就不需要在代表和数据源中添加条件,我可以轻松管理。选择是你喜欢的。

    现在你的 UI 设计看起来像这样

    绿色按钮用于显示隐藏您的左侧收藏视图(您在帖子中提到)。

    根据您的要求在CollectionViewTableView 中设置您的数据。

    要切换左侧菜单,只需在 greenButton 操作上使用以下一行代码。

    @IBAction func btnToggle(_ sender: Any) 
        colView.isHidden = !colView.isHidden 
    
    

    对于简单的动画

    @IBAction func btnToggle(_ sender: Any) 
        UIView.animate(withDuration: 0.3)             
            self.colView.isHidden = !self.colView.isHidden
        
    
    

输出:

编辑

你可以在scrollview中取stackView并关闭colview、tblView滚动。检查以下:

    UI 层次结构

    额外的代码工作

    override func viewDidAppear(_ animated: Bool) 
        super.viewDidAppear(animated)
        colView.isScrollEnabled = false
        tblView.isScrollEnabled = false
    
        colView.reloadData()
        tblView.reloadData()
    
        scrollView.contentSize = CGSize(width: self.view.frame.width,
                                        height:  max(colView.contentSize.height, tblView.contentSize.height))
        stackHeight.constant = scrollView.contentSize.height
    
    
    

注意:可能会导致一些意想不到的输出(可以/不能),所以需要注意。

输出:

【讨论】:

嗯您的解决方案对我不起作用,因为使用这种方法滚动适用于单个组件。请阅读我上面的评论 感谢您的解决方案,但我认为这不是有效的解决方案,因为如果我们禁用单个组件中的滚动视图并提供所有内容大小(在这种情况下,我们不使用 collectionview/tableview 的功能)。请让我知道您对此的看法。 @AnjaneyuluBattula 两者都是单独的组件,并且都单独工作,要使它们作为一个单元工作,您需要将它们与某些东西绑定。【参考方案2】:

您需要的是具有自定义布局的 UICollectionView。使用这种方法可以达到你需要的效果。

有如何实现自己的自定义布局的教程的基调。 Here 就是其中之一

【讨论】:

教程中的任何一种都解决了OP的问题吗?

以上是关于iOS 用 UICollectionView 如何实现这种布局的主要内容,如果未能解决你的问题,请参考以下文章

[IOS] - UITableView 与 UICollectionView API及其使用

如何在 iOS 中动态更改 UICollectionView 单元格高度

如何在ios的UIPageControl中放置UICollectionView和按钮?

iOS:`UICollectionview`,如何通过它的`indexPath`获取单元格的`contentoffset`

iOS6 UICollectionView 和 UIPageControl - 如何获得可见单元格?

如何在 iOS Objective-c 的 UICollectionView 中创建无限滚动