Tag: uicollectionview

如何创建自定义可移动UITableViewCell / UICollectionViewCell。

难度等级:容易 在本教程中,您将学习如何通过长按手势来制作可移动的表格视图单元格。 您可以在我的github页面上找到相同的教程。 bhaveshtandel17 / MovableTableViewCell MovableTableViewCell –在本教程中,您将学习如何通过长按手势来移动表格视图单元格。 github.com 怎么做? 添加UILongGestureRecognizer 处理UIGestureRecognizerState.began 处理UIGestureRecognizerState.changed 让我们开始吧!! 🎉

iOS TableView使用Swift预取数据源

Apple引入了用于在iOS 10中预取UITableView和UICollectionView的 API。这是有关如何实现UITableViewDataSourcePrefetching协议的简短故事。 总览 为了实现预取,我们向视图控制器确认了UITableViewDataSourcePrefetching协议,就像UITableViewDataSource和UITableViewDelegate一样 。 这使表视图的数据源可以在调用tableView(_:cellForRowAt 🙂数据源方法之前开始为单元格加载数据。 入门 将视图控制器设置为表视图预取数据源 tableView.prefetchDataSource =自我 在tableView(_:prefetchRowsAt :)的实现中,初始化指定索引路径中单元格所需的数据的异步加载。 func tableView(_ tableView:UITableView,prefetchRowsAt indexPaths:[IndexPath]){ 用于indexPaths中的indexPath { 警卫让_ = loadingOperations [indexPath]否则{返回} 如果让dataLoader = dataStore.loadPhoto(at:indexPath.row){ loadingQueue.addOperation(dataLoader) loadingOperations [indexPath] = dataLoader } } } 当表视图通知您tableView(_:cancelPrefetchingForRowsAt 🙂方法不再需要数据时,取消挂起的数据加载操作 func tableView(_ tableView:UITableView,cancelPrefetchingForRowsAt indexPaths:[IndexPath]){ 用于indexPaths中的indexPath { 如果让dataLoader = loadingOperations [indexPath] { dataLoader.cancel() loadingOperations.removeValue(forKey:indexPath) } } } 异步加载数据 与tableView(_:cellForRowAt […]

UICollectionView具有在iOS 9和10中使用自动布局自动调整单元格大小的功能

警告!!! :使用基本SDK> = iOS 12进行构建时不起作用 在开发iOS应用时。 您通常会遇到一个使用垂直卡片设计的应用程序,如下面的屏幕截图所示。 如果您熟悉iOS Apps开发。 您将知道有2种选择。 使用UITableView或UICollectionView。 在本教程中,我将使用UICollectionView,因为它比UITableView具有更高的可伸缩性,并且您可以在iPad中采用多列。 在WWDC 2016视频会议219:iOS 10中UICollectionView的新增功能。苹果表示,从下面的屏幕快照中收集视图单元格大小有3种方法 在本教程中,我们将使用方法1 自动布局 。 开始吧 首先设置您的视图控制器和UICollectionView。 将您的UICollectionView出口命名为viewController的4面的“ collectionView”引脚约束 由于我们将不会在情节提要中使用集合视图单元格(我们将使用nib代替),因此我们将集合视图中的项目数设置为0,并确保“布局”为“流”,因为我们将使用集合视图流布局来制作单元格自动调整大小。 接下来,创建一个用于收集视图单元格的类及其xib。 在本教程中,我们将其命名为Cell.swift和Cell.xib 别忘了将nib注册为viewDidLoad中的单元。 我们还将UICollectionViewFlowLayout的EstimateItemSize设置为(1,1),因为当设置了估算项的大小时,flowLayout将通过自动布局使用自动调整大小(这是常见的陷阱)。 现在是时候在Cell.xib中设计单元格了,如果您将单元格大小设置为想要的最大宽度(对于5.5英寸的屏幕,> 414则是安全的),如果将宽度设置得太小,应用程序将在运行时崩溃(例如。您将宽度设置为350,它将在5.5英寸的屏幕上崩溃),并为其增加一些高度(请注意,此尺寸仅用于设计时) 将UIView用作容器,以便所有视图将单元格的第4针固定到单元格。 接下来,我们如下设计单元。 确保最底部的视图和最右侧的销钉固定到容器视图。 这是单元自动调整大小所必需的。 然后我们制作单元类的出口 为容器视图宽度创建约束,并为单元格类创建出口 然后设置内容视图宽度约束,以使其与您在情节提要中设置的从笔尖减去集合视图插图中唤醒时的屏幕尺寸匹配。 我们还设置了self.contentView.translatesAutoresizingMaskIntoConstraints = false,以防止Xcode为不需要的单元格的宽度和高度生成自动布局约束。 现在,我们应该像往常一样通过将数据源添加到集合视图中进行测试并运行 示例项目在这里:https://github.com/tttsunny/CollectionViewAutoSizingTest

有效地将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,用户就不能向左滚动,因为它是第一个索引路径。 […]