折叠UICollectionView

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了折叠UICollectionView相关的知识,希望对你有一定的参考价值。

参考技术A 先分析一下结构,整体是UICollectionView, 在UICollectionView头部嵌套一个UICollectionView,详细内容如图所示:

先创建一个UICollectionView, UICollectionView的顶部偏移120高度,来做为UICollectionView的头部试图,在头部添加一个UICollectionView。

实现UICollectionViewDataSource、UICollectionViewDelegate
确定有几个区域,先判断是哪一个UICollectionView, 如果是头部UICollectionView,区数为1,如果是_collectionView,区数是3;

确定每个区有多少行,先判断是哪一个UICollectionView, 如果是头部UICollectionView,行数为_titleArray.count; 如果是_collectionView,先判断下拉列表是否打开,如果是打开的行数为 _productTitleArray.count,如果不打开行数就为0;

添加区头内容,使用区头首先需要注册TitleCollectionReusableView,上面我已经注册过了,如果没有注册,区头就会不出来。这里加了一个一个判断,主要是将区头添加到_collectionView,如果不加判断我们的头部试图也会有区头。

区头的大小设置,要判断一个加大小添加到有区头的UICollectionView上去,要不然会崩溃的

加载cell, 判断不同的UICollectionView,加载不同样式、内容的cell

添加区头的点击下拉或者关闭方法,现将开关数组的属性调整,然后刷新当前区域的内容

最后效果:

iOS 用 UICollectionView 如何实现这种布局

【中文标题】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的问题吗?

以上是关于折叠UICollectionView的主要内容,如果未能解决你的问题,请参考以下文章

vim技巧:折叠快捷键

oeasy教您玩转vim - 70 - # 折叠细节

Android ListView 折叠要怎么弄?

VIM 代码折叠

Vim代码折叠的indent模式

带有折叠状态图标的 Bootstrap 4 可折叠卡片