Tag: uicollectionview

有效地将UISearchController与UICollectionView结合使用

使用UITableView可以轻松集成UISearchController,而使用UICollectionView则不容易 问题 苹果公司的iOS类UITableView与UISearchController及其UISearchBar配合得很好,但是,几乎所有开发人员在尝试将搜索栏与UICollectionView对象进行可视化集成时都举手示意。 在开发负责显示大型组织的REST服务的照片缩略图的应用程序时,我发现了这个问题,并且我希望拥有与UITableView相同的布局。 基于StackOverflow和其他发布内容,大多数人要么不理会试图直观地集成类,要么重载了节标题。 解决方案 由于我希望搜索栏以动画方式显示和隐藏,并在UICollectionViewController的上下文中与相关的集合视图保持正确的尺寸,因此这比我期望支持iOS 9的工作量要多得多和10,但我确实为我的需要制定了解决方案。 为了实现这一点,我编写了一个名为DSSSearchController的UISearchController子类,该子类添加了许多用于显示和隐藏搜索栏的方法。 我将其设计为可与任何视图一起使用,但仅使用特定的集合视图对其进行了测试。 在下面,您将找到Objective-C标头和源代码以及Swift中的版本。 如您所见,需要大量代码来确保搜索栏相对于集合视图的大小正确。 在iOS 9和10中,Apple似乎不将AutoLayout与由UICollectionViewController管理的集合视图一起使用,因此这就是为什么使用框架进行大量计算的原因-试图使用AutoLayout被证明是有问题的。 早期,我发现某些动画会产生一些我不喜欢的搜索栏重影或覆盖,因此这就是为什么某些操作按其原样进行排序的原因。 为了使用我的类,我编写了一个名为configureSearchController的方法,该方法在viewDidLoad期间调用以初始化该类并在搜索栏上设置一些选项。 在我的原始代码中,获得searchBar属性后,将其barTintColor更改为深海蓝色,将tintColor更改为白色,并将其搜索字段的tintColor更改为深海蓝色。 另外,我的导航栏的barStyle属性具有UIBarStyleBlack。 当用户点击导航栏中的放大镜图标时,将调用toggleSearchBar:方法。 我发现当我要展示一个视图控制器时,我需要知道我的搜索控制器是否是要展示的控制器,这是在搜索字段具有焦点时发生的。 我确定我的解决方案可以改进,并且可能会在更高版本的iOS中中断,但目前可以使用。 希望iOS 10的后继版本将内置一个解决方案。

UICollectionViewCell动态高度(Swift)

我一直试图使CollectionViewCells动态化,但是在线解决方案要么受到限制,要么根本就不起作用。 因此,我决定根据以下要求进行研究: 以编程方式(无情节提要) 设备方向 基于内容的高度 许多Stackoverflow的解决方案都很复杂,不需要很多代码,因此我的第二个目的是找到一种方法,以尽可能少的代码解决问题。 让我们开始吧! 步骤1 在您的ViewController中 , 创建类型为UICollectionViewFlowLayout的自定义布局,并设置EstimatedItemSize 。 然后,将UICollectionViewController的布局设置为刚创建的布局。

等间距的UICollectionView单元格

大多数iOS开发人员使用UICollectionView,并且应内置等距单元 问题 苹果的iOS类UICollectionView和UICollectionViewFlowLayout被许多应用程序开发人员使用,并且大多数情况下这些类可以很好地协同工作,不需要太多的自定义,但是它们做得不好的一件事是自动为所有设备布局分配单元格。 在开发负责显示大型组织的REST服务的照片缩略图的应用程序时,我发现了这个问题。 使用默认值,甚至使用稍微调整的值,我的布局看起来都类似于以下屏幕截图。 虽然单元格之间的水平空白可能很好,但垂直空白要么不存在,要么与水平空白不一致; 同样,在屏幕边缘周围留有一些空白也很好。 可以调整这些值,但是对于每个设备和方向,每个值可以不同。 当前,Xcode的Interface Builder编辑器和UICollectionViewFlowLayout类都没有提供自动设置这些值的方法。 解决方案 为了解决这个问题,我写了一个UICollectionViewFlowLayout的子类DSSCollectionViewFlowLayout,它重写了prepareLayout方法以计算属性minimumLineSpacing,minimumInteritemSpacing和sectionInset所需的值,因此每当用户更改设备的方向或布局时,它们都具有相同的值。应用程序。 进行此更改后,每个单元格周围的空白区域将变得更加令人愉悦。 尽管每个单元周围的空白空间在设备和方向上都不同,但是在特定布局内,空白空间是一致的。 在为Apple平台开发软件时,与编写源代码相比,我更喜欢在故事板和XIB / NIB中尽可能多地添加设置,因此我决定将属性placeEqualSpaceAroundAllCells添加到我的子类中,以便可以在集合视图的内部打开或关闭此功能。资源“身份检查器”面板。 我的子类DSSCollectionViewFlowLayout的Objective-C标头声明了属性placeEqualSpaceAroundAllCells,因此我的prepareLayout版本将知道是否执行等距的空白计算。 子类的prepareLayout实现的Objective-C源代码显示了如何计算水平或垂直滚动​​的正确空间。 而且,为了好玩,我也写了一个Swift版本。 我目前仅将此代码用于正方形和矩形固定大小的单元格,但它也应与可变大小的单元格的集合视图一起使用。

如果您要使用动态尺寸的集合视图单元格,可以按照以下两个简单步骤操作:

具有动态大小的UICollectionViewCell 如果您要使用动态尺寸的集合视图单元格,可以按照以下两个简单步骤操作: 在控制器类中设置UICollectionViewFlowLayout的EstimatedItemSize属性。 在您的UICollectionViewCell子类中实现preferredLayoutAttributesFitting方法。 3.步骤2的替代方法是使用下面的类作为UICollectionViewCell子类的基类。 请评论您的改进建议。

Collor:UICollectionView的面向MVVM数据的框架

问题 在oui.sncf(法国和欧洲的火车票预订主要应用程序)上,我们的主要工作是显示服务器发送给我们的内容,大多数视图也是动态的。 此外,该应用程序经常会更新为新功能,甚至静态视图也会不断发展。 因此,我们决定使用UICollectionView! 它功能强大,动态且可自定义。 但是,当有很多不同的项目时,例如在Voyages-sncf.com应用程序中,Apple的面向indexPath的实现可能会变得混乱。 代码重复,切换大小写,难以维护,更新期间存在indexPath错误的风险…… 解 我们已经建立了一年的框架,以简化和加快这些UICollectionView屏幕的开发。 该库的主要目标是在一个文件中拥有一个可读的dataSource,它表示collectionView内容。 我们将其称为Collor , Coll [ ectionViewDescript] 或 。 https://github.com/voyages-sncf-technologies/Collor 科洛尔做了两件事: 首先,它提供了基于MVVM的可伸缩微体系结构,以组织代码并避免重复。 然后,它提供了一些功能,以便删除collectionView实现所需的许多代码,例如单元格注册等,并轻松更新collectionView:删除,插入,重新加载,比较等。 建筑 为了描述collectionView,一个collectionData对象,它继承自CollectionData 用来。 它分为部分和项目。 UICollectionView数据源要求collectionData知道节的数量,节中的项目数以及要出队的单元格。 collectionData对象包含一个SectionDescriptor数组:SectionDescriptor实现协议SectionDescribable ,并使用Apple的FlowLayout处理某些节功能,例如sectionInset , minimumInteritemSpacing和minimumLineSpacing 。 SectionDescriptor还包含一个CellDescriptor数组。 例如,在Voyages-sncf.com应用程序上,每次我们需要一个简单的标签单元时,我们只需创建一个新适配器即可实现VSCollectionLabelAdapter协议, VSCollectionLabelAdapter用UICollectionViewCell及其先前创建的描述符。 适配器管理标签的样式; 标签会使用Autolayout填充整个单元格,并使用NSAttributedString.boundingRect()计算其高度。 一些代码来解释我们做了什么: 确实,您可能有一个描述符,该描述符以最小的变化处理相似的单元:左侧或右侧的图像。 因此将有两个单元,但是一个描述符和一个公共适配器协议。 Collor是一个面向协议的框架。 可以在示例中实现新协议BackgroundDrawable ,而不是在节描述符中添加属性,因此可以在其他自定义布局中重用… 协议BackgroundDrawable { var backgroundInset:UIEdgeInsets {获取设置} } CollectionView更新 如果您已经必须在tableView或collectionView中实现扩展/折叠,那么Collor应该会让您感兴趣。 实际上, Collor提供了一些轻松添加,删除,重新加载节或项目的方法。 不再需要使用IndexPath ,您只需操纵描述符引用, Collor即可完成工作。 […]

将UICollectionViews添加到自定义UITableViewCell Xib教程(Swift 4 Xcode 9.2)

我惊讶地发现在UITableViewCell中实现UICollectionView有多少绊脚石。 因此,我将把我使用的大量资源汇编成一个连贯的起点。 注意:这不是针对初学者的教程。 它假定您了解tableViews以及使用xib文件制作自定义单元格。 它也不会涉及使收藏夹视图看起来不错的任何事情。 在收藏夹视图中拖动 添加约束 找出您不能将CollectionViewCells添加到新添加的集合视图中。 原来,您需要一个单独的文件来容纳要显示的任何“收藏夹视图”单元格。 (当您的UICollectionView在Xib文件中时) 您可以在CollectionViewCell Xib中做任何您想做的事情,就本教程而言,我将更改背景色。 确保为您的单元格提供一个resuableIdentifier。 步骤1:返回您的tableViewCells Xib文件。 步骤2:显示文件大纲 步骤3:控制从您的collectionView拖动到“文件的所有者”,然后选择dataSource,然后再次进行选择代理。 步骤4:控制从collectionView拖动到TableViewCell类,然后创建IBOutlet 步骤5:将tableViewCell类与UICollectionViewDelegate和UICollectionViewDataSource一致 将UICollectionViewDelegate和UICollectionViewDataSource添加到类描述 在awakeFromXib中创建collectionView的数据源并委托= self 添加numberOfItemsInSection函数 添加cellForItemAt函数 创建一个带有您的reuseIdentifier的单元,并向下转换为您的自定义单元。 命中运行。 它将立即崩溃。 我们需要“为该标识符注册一个笔尖或类,或者在情节提要中连接原型单元”。 在您的tableViewCell从Nib唤醒的情况下,添加以下行: self.collectionView.register(UINib.init(nibName:“ CollectionViewCell”,包:nil),forCellWithReuseIdentifier:“ collectionViewID”) 生成并再次运行。 它将起作用。 这是更新的tableViewCell的代码: 故障排除步骤: 我的标识符是否已分配并正确? 我是否已从我的collectionView拖动到Xib文件中的文件所有者? 希望这会有所帮助。 如果您愿意,请给我鼓掌。 如果有问题请发表评论。 伊恩(Ian)-aestusLabs

无限的UICollectionView

斯威夫特4,Xcode 9 如果您需要创建一个可以从一开始无限向左或向右滚动的收藏夹视图,那么这里就是正确的地方! 我为模型使用了简单的颜色阵列 懒惰的var colorList:[UIColor] = { var colors = [UIColor]() 步调为(从0到1.0:0.25){ 设color = UIColor(hue:CGFloat(hue), 饱和度:1 亮度:1 阿尔法:1) colors.append(颜色) } 返回颜色 }() 现在,让我们遵循那些collectionview协议。 注意,colorList只是使用%运算符包装了它的数据 func collectionView(_ collectionView:UICollectionView,cellForItemAt indexPath:IndexPath)-> UICollectionViewCell { let cell = collectionView.dequeueReusableCell(withReuseIdentifier:“ ColorCell”,for:indexPath) cell.backgroundColor = colorList [indexPath.row%colorList.count] 返回单元 } numberOfItemsInSection可以通过使用大常量来解决。 用户需要滚动数月才能到达终点 让infiniteSize = 10000000 func collectionView(_ collectionView:UICollectionView,numberOfItemsInSection部分:Int)-> Int { 返回infiniteSize } 通常只要初始化collectionview,用户就不能向左滚动,因为它是第一个索引路径。 […]

UICollectionView在顶部有一个偏移量

我的CollectionView高度与屏幕尺寸相同。 但是,当我运行该应用程序时,结果如下: 即使我设置了blowout.sectionIndes = UIEdgeInsets.zero (默认值为零,也不需要设置)。 这个偏移量来自哪里? 然后我意识到了这个错误信息: 未定义UICollectionViewFlowLayout的行为,因为: 项目高度必须小于UICollectionView的高度减去该部分插入的上限值和下限值,减去内容插入的上限值和下限值。 好的,最后的原因是因为autoAdjustsScrollViewInsets 。 这是苹果公司的文件: 摘要 一个布尔值,指示视图控制器是否应自动调整其滚动视图插图。 宣言 var automaticAdjustsScrollViewInsets: 布尔 {设置} 讨论区 此属性的默认值为true ,它使容器视图控制器知道应调整此视图控制器视图的滚动视图插图,以解决状态栏,搜索栏,导航栏,工具栏或选项卡栏占用的屏幕区域。 如果您的视图控制器实现管理其自己的滚动视图插图调整,则将此属性设置为false 。 我不需要考虑我的状态栏。 解决方案已设定 自我 .automaticallyAdjustsScrollViewInsets = false 在您的viewController中:

使用Swift泛型处理单元动作

给iOS开发人员一个 表格视图 ,他将编写10多个有关如何处理单元格操作的实现。 由于我们在Chili Labs中经常处理表格和集合,因此我想提出一个通用的解决方案,以解决项目中的单元动作。 我之前的文章中介绍的使用单元配置器的解决方案效果很好。 因此,将其作为基本模式可能是一个好主意。 首先,让我们添加TableDirector类,该类将存储单元配置器,并将成为UITableView的委托和数据源。 首先,我们需要向CellAction枚举中再添加一种情况,并返回其hashValue。 这里最具挑战性的事情是如何将自定义操作传递给CellActionProxy对象。 可以通过NotificationCenter发送通知来完成。 我们可以为CellAction枚举添加扩展,以方便地发送通知。 动作数据将存储在结构中,并通过userInfo参数发送。 最后,我们需要在TableDirector类中订阅并处理通知。 现在我们可以调用“跟随”动作并进行处理。 而已! 现在,我们有了一种机制,可以通用地处理任何单元操作。 进行少量修改,即可用于处理UICollectionViewCell操作。

让我们来谈谈细胞宝贝!

如今,我们在iOS中遇到问题。 代替代表模型视图控制器的MVC设计模式,我们有一种叫做Massive-View-Controller的疾病。 作为一项出色的“重构技能”,我们​​迅速采用了MVVM(模型-视图-视图模型)设计模式。 确实很好,这是毫无疑问的,但是让我们看一下iOS内部最常见的错误之一-精确地使用cell, UITableViewCell和UICollectionViewCell ,以及我们发现自己被“大规模”病毒感染的原因。 假设我们要在集合视图中展示用户: struct用户{ 变量名称:字符串 var imageUrl:字符串 } 我们这样定义集合视图单元格: 类UserCollectionViewCell:UICollectionViewCell { @IBOutlet弱var nameLabel:UILabel! @IBOutlet弱var profileImageView:UIImageView! } 在具有集合视图的视图控制器内部,我们将具有: 类UsersViewController:UIViewController { var users = [ 用户(名称:“ Djuro”,imageUrl:“ some_url”), 用户(名称:“ Alfirevic”,imageUrl:“ some_other_url”) ] } 扩展UsersViewController:UICollectionViewDataSource { func numberOfSections(在collectionView:UICollectionView中)-> Int { 返回1 } func collectionView(_ collectionView:UICollectionView,numberOfItemsInSection部分:Int)-> Int { 返回users.count } func collectionView(_ collectionView:UICollectionView,cellForItemAt indexPath:IndexPath)-> UICollectionViewCell […]