Articles of uicollectionview

在UICollectionView中创建HeaderView

最近,我正在寻找在UICollectionView中创建SectionHeaderView的方法,与UITableView相比,它有点难。 我将逐步向您展示如何在CollectionView中创建标题 首先,您需要创建一个简单的CollectionView。 为此,您可以从互联网上找到很多教程。 以下是创建节标题的一些步骤。 转到情节提要,然后打开该CollectionView的属性检查器,如下图所示>标记“ Section Header”复选框>设置标题的背景颜色任意>在部分标题中添加标签。 2.创建节标题的类, 该类将成为UICollectionReusableView的子类。 代码如下。 FlickrPhotoHeaderView类:UICollectionReusableView { @IBOutlet弱var标签:UILabel! } 3.转到情节提要>属性检查器>将HeaderView的标识符添加为“ headerID ”>打开身份检查器>添加您的类名(在本例中为“ FlickrPhotoHeaderView”)。 4.转到您的课程以及以下一些代码,如图所示。 添加以上代码后,您将能够创建CollectionView Header。

Membuat UICollectionView Xcode 10

Hai,Kembali Lagi .. Pada kesempatan kali ini saya akan membagikan cara membuat UICollectionView pada XCode 。 UICollectionView是一个对象,该对象管理数据项的有序集合,并使用可定制的布局显示它们。 [作者:developer.apple.com] Jadi apa bedanya dengan UITableView吗? Secara konsep keduanya sama。 Sama-sama digunakan untuk Menampilkan 设置数据 。 Hanya saja pada UICollectionView dapat melakukan beberapa kostumisasi seperti 流布局,动画,网格等 。Sedangkan pada UITableView hanya dapat menampilkan 设置数据 secara 垂直 。 Semuanya kembali […]

对图像进行下采样以获得更好的内存消耗和UICollectionView性能

任何可能出错的地方都会出错。 墨菲定律 在开发的每个步骤中,我们都会做出影响应用程序整体性能的架构决策。 我们都非常了解功耗和内存消耗对于移动应用程序极为重要。 我们也知道可用内存和应用程序的相对性能之间存在某种关联。 但是,在当今快速解决方案的世界中,缩短的期限和避免过早优化的精神使您容易错过重要的事情。 让我们看一下常见任务-图片库。 对于各种图像布局,它看起来可能会有所不同。 但是它们的共同点是-一批图像同时显示在屏幕上。 问题定义 假设您已决定从服务器获取下载的图像,并将其显示在UIImageView 。 这种方法完全没错。 此外,Apple建议在所有常见情况下使用UIImage和UIImageView来显示图像。 仅当您进行了某些特定的图像处理时例外。 让我们回到画廊。 可能您已经使用Simulator和最新的iPhone版本在不同的图像集上测试了该应用程序。 现在准备进行质量检查阶段。 Beta测试人员和QA工程师选择您的应用程序,然后您会看到以下看起来很奇怪的崩溃报告: 您将开始使用特定的图像集测试您的应用,然后看到以下内容: 几乎每个致力于性能最佳实践的WWDC会话都表示,iOS应用程序应使用尽可能少的内存。 内存是iOS上最受限制的资源。 系统可能要求的可用内存比其释放的速度快。 正如文档所述,此WWDC会话iOS没有传统的磁盘交换,而是使用内存压缩器技术。 普通用户的设备上有多个应用程序。 许多应用程序可能仍在后台,并继续消耗一些内存。 系统本身正在消耗的部分内存。 在这一点上,您可能认为仍然应该留有足够的内存来平稳地运行应用程序。 无论如何,iOS足够聪明,可以卸载一个或两个烦人的内存使用者。 但实际上,系统设置了内存限制,每个应用程序都可以使用该内存限制。 由于超出限制,前台应用程序中正在运行的应用程序可能会被关闭。 那么,为什么图像会导致这种后果呢? 图像渲染流程 在iOS中显示图像的最常见方法是使用UIImageView和UIImage 。 UIImage类负责管理图像数据,转换,应用适当的比例因子。 UIImageView —用于在应用程序界面中显示图像。 在WWDC上:Apple的图像和图形最佳实践工程师提供了一个非常简单直观的图表,说明了其实际工作方式。 基于此,当您使用UIImage在UIImageView绘制图像时,实际上需要执行几个步骤: 1.将压缩的图像数据加载到内存。 2.将压缩的图像数据转换为渲染系统可以理解的格式。 3.渲染解码图像。 让我们在这里停下来。 我们需要了解什么是图像,我们拥有哪种图像类型和格式以及如何存储图像。 图片类型 首先,有两种主要的图像类型:栅格(位图)和矢量。 光栅图像表示为由每个像素的编码后的单个值填充的矩形网格。 矢量图像是根据2D点定义的,由线,多边形和其他形状连接。 与栅格不同,矢量格式存储用于绘制图像的指令。 光栅图像和矢量图像各有优缺点,通常用于不同目的。 向量通常用于将要应用于物理产品,徽标,技术图纸,文本,图标等图像的图像,其中包含尖锐的几何形状。 矢量图像的主要优点是分辨率独立性。 这意味着可扩展性而又不损失清晰度和质量。 矢量图像使用从一个点到另一点的数学计算来形成线条和形状,这就是为什么它对每种分辨率和缩放都产生相同结果的原因。 […]

在您的ViewController中使用多个tableView或CollectionView

曾几何时,我为一个项目编写代码,该项目的第一页中有很多表和集合视图。 我记得我曾经用“容器视图”解决了这个问题,但这是一个错误的决定……。 另一个好用的选择是“滚动视图” ,它很容易实现,但操作起来又费时。 由于委托是一个协议,我认为有一个好的方法…… 协议和代表示例 协议和委托示例–在一个ViewController中使用多委托 github.com 首先创建一个NSObject类,以减少自定义,然后添加要用作超类的所有委托方法。 将Model属性添加到您的类中以进行设置并获取所有要显示的信息。 在我的情况下,数据模型名称为ItemManager。 创建一个dataModel类,并将其分配给您的DataProvider的Model。 自定义所有方法并设置DataModel之后,是时候将类设置为UITableView或UICollectionView的协议了。 使用Techniq的好处还在于您可以在应用程序中使用单元测试,我真的建议您阅读使用Swift 4进行测试驱动的iOS开发–第三版作者:Dominik Hauser博士 使用Swift 4进行测试驱动的iOS开发–第三版– PDF电子书| 现在只要$ 5 使用测试驱动的方法通过Swift 4和Xcode 9开发功能强大的iOS应用 www.packtpub.com

创建自己的UICollectionView API

在本文中,我们将创建一个外部框架,该框架将公开一些单元格,背景线和水平线装饰UICollectionViewFlowLayout以及一个垂直的自定义UICollectionViewFlowLayout ,该UICollectionViewFlowLayout管理单元格之间的边距和填充。 为什么要使用UICollectionview? 根据您的应用程序,使用UICollectionView来构建屏幕可以节省大量时间,主要是在您的屏幕是面向数据和上下文的情况下。 在两个其他对象之间添加一个单元比更新约束来显示或隐藏UI元素要容易得多。 UICollectionView的强大功能是DecorationView 。 在不增加单元格复杂性的情况下,您可以在其中一些背景后面添加背景,并在整个应用程序中重复使用它们。 最后, UICollectionView允许仅用几行代码即可对屏幕中的更改进行动画处理。 为什么要使用API​​? 大多数情况下,应用程序屏幕的设计是相同的:在许多屏幕中,相同的按钮,相同的元素只是内容不同但布局相同。 创建API的目的是以最简单的方式使用这些元素。 UICollectionView API的主要目标是花费更少的时间在构建屏幕上,并花费更多的时间来实现和测试逻辑,改善细节并拥有更易于维护的代码。 另一个优点是在应用程序中提供总体UI一致性,并尽可能与您的设计师提供的模型相似地创建屏幕。 科洛尔 Apple提供的用于实现UICollectionView的API是面向indexPath的。 在oui.sncf,我们创建了一个名为Collor的顶层,以实现面向数据的实现。 该库的主要目标是在一个文件中描述UICollectionView的结构。 在继续阅读本文之前,您应该看一下这两篇文章: Collor:UICollectionView的面向MVVM数据的框架 我们已经建立了一年的框架,以简化和加速我们的UICollectionView的开发。 UICollectionView:如何轻松处理更新 当您使用CollectionViews或TableViews时,困难的部分是当您需要添加,删除,移动一些单元格时… medium.com 我们走吧 1)创建自己的框架 为了优化编译时间并最小化依赖关系,最好的方法是在工作空间中创建一个框架。 我们将其命名为CollorAPI 。 如果您打算在其他项目中使用此框架,则建议您创建一个私有容器。 我们在这里不解释创建框架的过程,如果需要,您可以找到很多教程: 模块化iOS应用程序 “只要离开您的计算机去喝咖啡,应用程序就会编译!” medium.com 2)唯一的节描述符 大多数时候,唯一可定制的节描述符足以满足我们的需求。 4)垂直空间 必须对每个通用单元进行边缘到边缘设计。 然后,将在collectionView的布局中以及带有部分插图的地方处理边距和填充。 通过应用此规则,无需增加单元格的复杂性或添加空白单元格来填补空白,就更容易遵守设计屏幕。 首先,我们在builder实现此功能: 最后,collectionData如下所示: 在oui.sncf处 ,有11种装饰类型。 它们使您可以添加票证背景或建立旅程时间表。 对于时间轴,我们在部分构建器内部创建了一个嵌套构建器。 通过这种方式,角色可以很好地分离,并且其他开发人员可以轻松使用该API。 单元在布局中向右移动,以便重用它们,而不是使用内部偏移量创建新单元。 timeLineBuilder 继续,在本文中,我们介绍了您未来框架的基础。 现在就取决于您的需求了! 感谢您的阅读,并让我知道您在Twitter上的想法。

在Xamarin.iOS中捕捉UICollectionView

我在玩Xamarin.iOS UICollectionView控件,试图使其表现得像UIPageViewController ,即,我想要的是在滚动水平集合时的捕捉/滑动效果。 我的愿望清单上的另一个功能是屏幕尺寸,例如具有足够空间的项目可以显示上一个和下一个项目内容的一小部分,因此应用程序用户可以轻松地理解该集合以及该集合可以被捕捉/滑动水平地。 从我的角度来看,这种行为可以提高应用程序的用户体验。 这是我想到的演示。 这是在Xamarin iOS应用程序中实现所描述行为的最简单,最可靠解决方案的重要部分。 首先,扩展UICollectionViewDelegateFlowLayout并重写GetSizeForItem , GetInsetForSection , GetMinimumLineSpacingForSection方法以设置所需项目的大小和间距。 然后重写WillEndDragging方法,以在应用手势后滚动所需的项目。 其次,请确保设置UIScrollView.DecelerationRateFast 。 最后,不要忘记使用UICollectionViewScrollDirection.Horizontal 。 我将其设置在HorizontalCollectionViewFlowLayout ,该GetInvalidationContextForBoundsChange也用于重写GetInvalidationContextForBoundsChange方法,以便在设备旋转期间强制重新计算项目的宽度。 就是这样。 不要犹豫,使用我上载到GitHub的演示Xamarin.iOS项目。 Pavel-Sulimau / SnappingUICollectionView 捕捉Xamarin.iOS UICollectionView。 通过创建一个 github.com 来为Pavel-Sulimau / SnappingUICollectionView开发做出贡献。 资料来源: https://docs.microsoft.com/zh-cn/xamarin/ios/user-interface/controls/uicollectionview https://stackoverflow.com/questions/29658328/uicollectionview-horizo​​ntal-paging-not-centered https://medium.com/@shaibalassiano/tutorial-horizo​​ntal-uicollectionview-with-paging-9421b479ee94 https://stackoverflow.com/questions/33855945/uicollectionview-snap-onto-cell-when-scrolling-horizo​​ntally http://aplus.rs/2015/how-to-invalidate-flow-collection-view-layout-on-rotation/

UITableView中的多个集合视图

我们是否曾经想过需要多个水平可滚动CollectionView的场景? 如果是,则继续。 我们将逐步进行。 让我们开始 打开Main.storyboard并添加UIViewController。 在UIViewController中添加UITableView并在tableview内添加tableviewcell 在UITableViewCell中添加一个UICollectionView并在其中添加一个UICollectionViewCell 将UITableView的约束设置为UIViewController为 topMargin = 0,leftMargin = 0,rightMargin = 0,bottomMargin = 0 4.在UICollectionViewCell中添加一个新图像,在所有上面添加之后,结构将如下图所示 5.接下来,我们必须将CollectionView的可滚动方向设置为水平。 6.将UITableview委托和数据源连接到UIviewController本身。 7.添加UITableViewCell类型的新文件,并将Storyboard中的CollectionView与新添加的文件连接。 类TableViewCell:UITableViewCell,UICollectionViewDelegate,UICollectionViewDataSource,UICollectionViewDelegateFlowLayout {@IBOutlet弱var collectionView:UICollectionView!} 8.接下来,在ViewController中,我们将实现UITableView的数据源。 表视图中的numberOfSection将等于所需的collectionview的数量。 在UIViewController中添加以下代码 导入UIKit类ViewController:UIViewController,UITableViewDelegate,UITableViewDataSource {@IBOutlet弱变量tableView:UITableView!部分:Int)->字符串? {返回“ Section Title \(section)”}}重写func didReceiveMemoryWarning(){super.didReceiveMemoryWarning()//处理所有可以重新创建的资源。} func numberOfSections(在tableView中:UITableView)-> Int {return 5} func tableView(_ tableView:UITableView,numberOfRowsInSection部分:Int)-> Int {返回1} func tableView(_ tableView:UITableView,cellForRowAt indexPath:IndexPath)-> UITableViewCell {如果让单元格= tableView.dequeueReusableCell(withIdentifier:“ tableViewCell”,的:indexPath)为? TableViewCell {返回单元格}返回UITableViewCell()}} 9.添加一个类型为UICollectionViewCell的新文件。 […]

使用UICollectionView构建自适应的自适应iOS应用

UICollectionView是一个UIKit视图,用于管理已订购商品的集合,并使用可自定义的布局显示商品。 它是由Apple在WWDC 2012中随iOS 6 SDK发行而引入的。 UICollectionView接口与旧的UITableView非常相似,因为它提供DataSource作为显示数据的源,并提供Delegate处理每个项目的交互。 与UITableView在UITableViewCell内部使用固定列表布局显示每一行不同, UICollectionView通过子类化UICollectionViewLayout为开发人员提供了灵活性和可自定义性以提供自己的布局,它还支持自定义装饰视图,每个单独的横断面图和单元格的可自定义大小。 Apple本身提供了一种UICollectionViewFlowLayout布局,称为UICollectionViewFlowLayout 。 UICollectionViewFlowLayout是使用网格系统显示项目的布局,并支持页眉和页脚。 它还提供了2个垂直和水平滚动方向。 在垂直方向上,项目的宽度受集合视图的宽度限制,因此在每一行中,它会尝试在下降到下一行之前在集合视图宽度的范围内填充尽可能多的项目,因此用户可以垂直滚动内容。 在水平方向上,内容的高度受集合视图的高度限制,因此在每一列中,在向右移动到下一列之前,将尽可能多地添加项目,以便用户可以水平滚动。 如果要使用集合视图构建圆盘传送带,则水平滚动方向非常适合。 我们将建立什么 在本文中,我们将使用UICollectionViewFlowLayout构建一个自适应的电影列表应用程序,以适应从小型iPhone 5到最大iPad Pro的各种UICollectionViewFlowLayout 。 用户将具有使用列表,小网格和大网格布局显示电影的选项。 以下是我们将要执行的任务: 启动项目。 建立模型。 构建MainListViewController 。 构建列表布局。 构建网格布局。 开始项目 要开始项目,您可以在下面的GitHub存储库中下载入门项目。 alfianlosari /响应式iOS收集视图启动器 带有Collection View的自适应和自适应iOS App的入门项目… github.com 入门项目包含多个资产,用于列表的集合视图单元格以及我们将用于集合视图的网格项目布局。 建立模型 让我们创建代表电影的模型。 创建一个新文件,并将其命名为Movie.swift 。 复制下面的声明以创建具有所有属性的Movie结构。 我们还需要确保更新MovieLayoutListCollectionViewCell ,在这里我们创建一个方法setup(movie:)以便在通过电影时可以设置标签和图像视图。 建立网格布局 让我们构建网格布局,在此布局中,每个单元格将仅在每个单元格内显示电影的海报图像。 窥视入门项目提供的MovieLayoutGridCollectionViewCell ,以查看布局。 确保更新MovieLayoutGridCollectionViewCell ,在这里我们创建一个方法setup(movie:)以便在通过电影时可以设置图像视图。 结论 最后,恭喜!我们已经成功使用Collection View构建了自适应的自适应iOS应用程序! 借助Cocoa Touch […]

使用UIDynamicAnimator的可滚动BottomSheet

我们将仅使用UICollectionView实现BottomSheet ,对具有可滚动内容的UIView frame进行动画处理不是一个好主意。 UIView frame更改和UIScrollView内容更改无法正常协同工作且难以处理,如果您也遇到此问题,并且想要实现双向连续动画的BottomSheet ,请继续阅读,我们将仅对UIScrollView的contentOffset进行动画处理。 我们应该知道什么 拥有UIDynamicAnimator和UICollectionView丰富知识将大有帮助,我从本教程中了解到有益的知识。 整个想法 我们以某种方式使UIScrollView contentOffset属性符合UIDynamicItem然后可以使用UIDynamicAnimator对其进行动画UIDynamicAnimator 🙂 ContentOffsetDynamicItem UICollectionView本身作为UIView符合UIDynamicItem ,但我们不想为其frame设置动画,我们希望为其contentOffset设置动画,因此我们需要包装器为我们做这件事。 “知识的最大敌人不是无知,而是知识的幻觉。” —斯蒂芬·霍金 我很高兴听到您的反馈。 🙂

SwiftSpringBoard:实现iOS主屏幕布局

SwiftSpringBoard是一个旨在重现iOS主屏幕图标配置和功能的项目。 对SwiftSwiftBoard的需求来自我们的一位客户,该客户在其iOS应用程序的主屏幕上使用集合视图。 该客户愿意提供Apple风格的主页按钮重新排序功能以及隐藏单元格的功能。 我们需要一个能够完成以下功能的组件: 以与在iOS主屏幕上显示应用程序相同的方式呈现项目 在屏幕的一个或多个页面上对元素进行重新排序(通过拖放) 从屏幕上删除元素 我们要做的第一件事当然是查找可以满足我们需求的可用框架。 如果您自己这样做,您可能会得出与我们相同的结论:首先,很少有框架与我们的目标相关,其次,截至2017年11月,大多数可用工具尚未得到更新。至少两年。 我们的库依赖于4种类型的对象: SpringBoardView:显示主屏幕样式项的视图(UICollectionView的子类) SpringBoardManager:实现视图行为核心逻辑的对象 SpringBoardDataSource:应用程序用来设置组件的协议 SpringBoardLayout:视图使用的自定义布局(UICollectionViewFlowLayout的子类) 为了最大程度地减少麻烦和不必要的重新实现(并最大程度地了解世界各地的知识),SwiftSpringBoard组件主要使用UICollectionViews中的标准行为:自iOS 9.0起,UICollectionViews本身就可以提供适合基本功能的重新排序机制需要。 此外,自iOS 2.0起,UIScrollViews即可使用分页。 这些功能结合在一起,为我们满足需求提供了坚实的起点。 我们设计了SpringBoardDataSource协议,以便经典UICollectionView机制的用户不会迷路。 首先,用户必须设置其跳板将在单个页面上使用的列数和行数。 为此,用户必须实现以下方法: 对于水平滚动,将逐列加载项目: 问题是,由于主屏幕中的分页是水平进行的,因此我们必须坚持水平滚动。 但是,正如您所看到的,垂直滚动将项目放置的方式与预期放置首页项目的方式相同。 因此,我们必须以垂直布局的方式自己计算项目位置。 计算项目位置本身意味着要处理项目的创建和删除,否则我们将保留对无用变量的引用,这些变量在使用UIKit的默认组件时肯定会导致崩溃,并且我们不会意识到将新项目添加到视图中,这意味着它们永远不会被显示。 布局还必须处理无法完全填充的页面,这是我们在主屏幕上可以看到的行为。 经过大量故障排除后,我们成功处理了布局及其几次更新。 但是组件的部分逻辑仍必须由用户处理,因为他是唯一可以完全访问加载在弹簧板上的原始数据的用户。 假设您的跳板数据由存储在一个名为dataContent的主数组中的数字数组组成 。 您对SpringBoardDataSource的实现应如下所示: 到目前为止,我们打算改进SwiftSpringBoard的几种方法包括: 动态列和行计数:这将是我们的下一个发展。 从今天起,用户必须手动设置其行数和列数以用于布局以正确计算尺寸。 我们希望仅基于布局的插图和间距属性以及项目的固定大小来自动计算行数和列数。 处理文件夹:尽管用户已经可以实现此行为,但我们正在寻找一种干净简单的方法将此功能添加到我们的库中。 一种选择是为打开的文件夹创建SpringBoardView的另一个实例。 如果您碰巧使用了我们的组件,我们真的会对您将如何使用它感到好奇。 如果您有任何问题/建议,请随时与我们联系。 Wassa是室内定位和计算机视觉领域的创新数字代理专家。 无论您是想帮助客户在建筑物中找到自己的出路,增强产品的用户体验,收集有关客户的数据还是分析某个地点的人流量和行为,我们的创新实验室都将科学的专业知识带给您最大的设计灵感根据您的目标调整解决方案。 在 – 找到我们: Facebook和Twitter 领英 的GitHub 我们的网站