Tag: uicollectionview

使用UIPanGestureRecognizer删除UICollectionView Swift 3中的单元格

我想分享一个快速的小项目,该项目使用UIPanGestureRecognizer删除UICollectionView中的单元格。 以下是其外观示例: 假定您具有如何创建UICollectionView和自定义CollectionViewCell的基本知识。 项目文件可以位于这里: GitHub – almusto / PanToDelete 通过在GitHub上创建一个帐户为PanToDelete开发做出贡献。 github.com 当涉及到UI时,该项目非常简单。 我所做的就是创建一个UICollectionViewController,并将其嵌入到导航控制器中的自定义单元格。 设置CollectionView: 让我们快速浏览一下UICollectionView的基本设置 因为我们使用的是UICollectionViewController,所以我们不需要设置委托,因为Xcode会为我们这样做。 但是,我们确实设置了UICollectionViewDelegateFlowLayout以允许我们调整在viewDidLoad()之后的第一个函数中执行的单元格框架。 接下来的三个函数是标准的collectionView函数,我们在其中设置节数,将numberOfItemsInSection设置为grocerList.count,然后创建单元格本身。 您可能想知道功能允许我删除单元格的位置在哪里……不要担心,我稍后再讲。 设置自定义单元: 这是我们大多数代码将要使用的地方。 让我们先来看一下变量和初始化程序。 我在这里创建了一些变量。 cellLabel将存储我们的杂货项目,两个deleteButton标签将根据我们平移的方式添加到左侧或右侧的内容视图下方。 当然还有我们的平移手势识别器。 我们还向类添加了UIGestureRecognizerDelegate协议。 稍后我将解释原因。 接下来,我们有两个init方法,其中调用了我创建的自定义函数comonInit()。 对于所需的init,我仍然有些朦胧,但是据我所知,当我们创建自己的自定义类init时,我们需要使用它。 此必需的init允许我们通过NSCoder“取消存档”数据。 似乎这里发生了很多事情,但这确实很简单。 而不是在情节提要中创建这些对象,而是手动进行,因此我们必须初始化每个对象并将其添加到视图中。 让我们一次浏览一个项目。 首先,我将contentView的背景色设置为灰色,将self.background颜色设置为红色。 每个单元格都有一个contentView,它显示我们想要的单元格中的对象或颜色。 当我设置self.background颜色时,实际上是在contentView下设置颜色。 完成此操作后,我将初始化cellLabel并将其添加到contentView中。 我也将translatesAutoresizingMaskIntoConstraints设置为false,这使我可以手动设置该标签的约束。 如果我不这样做,则自动布局会尝试为我创建约束。 同样,我初始化deleteLables并将它们插入到contentView的下面。 因为我希望这些标签可以用平底锅拍摄,所以我不在这里设置边框。 相反,我在平底锅发生时设置了帧。 最后,我使用一个名为onPan的动作来初始化平移手势。 与创建UIButton时非常相似。 我还将委托设为self..self作为CustomCell类。 现在,我们的视图已初始化,让我们开始平移手势: 制作手势: 首先让我们看一下我们的onPan函数。 您会注意到我们的if语句涵盖了手势的某些不同状态。 如果状态为“开始”,则不执行任何操作;如果状态为“已更改”,则调用setNeedsLayout()。 该方法说“在下一个运行循环上调用layoutSubViews()。”当某人按下我们的单元格时,状态变为开始,然后当他们向左或向右移动该单元格时,状态变为更改并调用layoutSubViews()。 现在在layoutSubViews()中,我们通过调用translation(in:View)来检查状态是否已更改,以及状态是否改变,以获取平移的当前点,该平移返回“标识坐标系统中视图新位置的点”。然后,我们根据该点设置contentView和deleteLabels的框架。 现在回到我们的onPan函数,我们有一条else语句,它检查平移手势速度以查看其是否大于每秒500点。 在检查速度之前,您会注意到腹肌。 这是绝对值,我们这样做的原因是因为用户可以向左或向右平移,因此该值可能为负。 […]

在iOS 11和Swift 4中拖放集合视图单元格

在本教程中,我们将说明如何在iPhone IOS 11中的同一屏幕上的两个集合视图中拖放集合视图单元格。在IOS 11中,苹果引入了两种协议类型UICollectionViewDragDelegate和UICollectionViewDropDelegate,通过使用这些协议方法,我们可以将一个集合视图单元格从一个集合视图拖放到另一个集合视图。 注意:-请注意, iPhone和iPad均支持拖放功能,在iPad上,不同应用程序,同一应用程序和同一屏幕之间可使用拖放功能,但在iPhone中,仅可在相似屏幕上使用拖放功能。 首先创建基础项目 通过使用CollectionViewDataSource和CollectionViewDelegate方法在同一屏幕上创建带有两个collectionView的基础项目。 您可以从此处下载基础项目。 现在,我们开始拖放代理,将CollectionViewCell从FirstCollectionView移至SecondCollectionView。 拖动集合视图单元格(UICollectionViewDragDelegateprotocol) 首先,我们需要实现拖动委托的itemsForBeginning方法,其中我们需要返回UIDragItem的数组。 注意:-必须记住将dragDelegate设置为self。 并启用dragInteraction。 override func viewDidLoad() { super.viewDidLoad() topCollectionView?.dragDelegate = self topCollectionView.dragInteractionEnabled = true } itemsForBeginning- >提供项目以开始与给定indexPath相关联的拖动。 如果返回一个空数组,则拖动会话将不会开始。 为了创建UIDragItem,首先我们需要创建NSItemProvider,并将该项目提供者传递到UIDragItem(itemProvider 🙂 extension ViewController: UICollectionViewDragDelegate { func collectionView(_ collectionView: UICollectionView, itemsForBeginning session: UIDragSession, at indexPath: IndexPath) -> [UIDragItem] { let dragItem = self.dragItem(forPhotoAt: indexPath) return [dragItem] […]

CollectionView自定义布局

在iOS上添加UITableView,在UICollectionView上添加UITableView。 在UICollectionView中使用网格,在UI中使用UI。 UIKitViewKit的UICollectionViewFlowLayout布局,UICollectionViewLayout的自定义视图。 Apple的自定义布局自定义布局流的布局。 (UICollectionViewFlowLayout中的对象列表) 在UICollectionView中添加UICollectionViewLayout在UICollectionViewLayout中。 그래서适用于iOS的Collection View编程指南핵심API와属性와정정해보았다。 UICollectionViewLayoutAttributes CollectionViewLayout和UICollectionViewLayoutAttributes一起显示。 (框架,中心,位置,zIndex등) 본적인용하는게。。。。있다。 (레이아웃반복적으로반복적으것은이많은이비용。) 필수적으로불리는API및属性 prepareLayout conentSize属性 layoutAttributesForElementsInRect prepareLayout 초기계산을회를기회를제공 在UICollectionViewLayoutAttributes中获取结果。 (캐싱) 이부분에서로캐싱하는식으성능상좋음。 (매번属性호출시있음있음있음있음) contentSize 스크롤할지지정할있음。 flowLayout下载스한쪽방향으이아님。 layoutAttributesForElementsInRect prepareLayout음에음에음에호출되는함수 반환(반환사이즈) 필요함사각형과교차되는지를반환이반환이필요함。 layoutAttributesForItemAtIndexPath 요청함기주로개별레이아웃객체에기주로적으。 例如)삭및제시에시에이션정보 initialLayoutAttributesForAppearingItem cell이보여질때기초지정해줄속성을。 이통해서插入애니메이션을수있음。 finalLayoutAttributesForDisappearingItemAtIndexPath cell사라질때지정해줄수。 删除애니메이션을션을수。 invalidateLayout 레이아웃을기초(업데이트할기수제공) 이는레이아웃에지이지데이터를다시정설아님。 (reloadData와다름) targetContentOffsetForProposedContentOffset:withScrollingVelocity: 함마막막막막함정함。 크롤시스통해서지지정해있음있음있음 CustomLayout설정방법 故事板에서collectionView의布局类를변경 collectionView.collectionViewLayout =커스텀레이아웃 请参见UICollectionViewLayout和API。 下载CustomLayout应用程序。 [이미지출처] https://developer.apple.com/library/archive/documentation/WindowsViews/Conceptual/CollectionViewPGforIOS/CreatingCustomLayouts/CreatingCustomLayouts.html#//apple_ref/doc/uid/TP40012334-CH5-SW1

iOS UITableViewCell,UICollectionViewCell,UITableViewHeaderFooterView和UICollectionReusableView出队和注册-使用Swift协议和泛型

如果您是iOS开发人员,则每天都会遇到UITableView和UICollectionView。 您将需要使用在静态位置声明的丑陋标识符字符串来注册Cell或UITableViewHeaderFooterView或UICollectionReusableView重用单元格。 所以你的代码将是这样的 完成ReusableView.swift类以包含在项目中: 希望这将帮助您减少代码混乱,并简化注册和重用TableView和CollectionView单元格,HeaderFooterViews和ReusableSupplementary视图的使用,而无需在每个单元格类中维护难看的静态字符串常量。

[iOS] [Swift]自定义UIcollectionView

最近开始有机会用到UIcollectionView,就来做一下笔记吧,个人本来认为它跟UItableView蛮像的,但实际做起来还是有一些区别。 直接开始吧!先拉个集合查看到故事板上面并设置好约束, collectionView左上角有内建一个cell,在这里不会用到所以可以直接删除掉,或者在下图右边的Collection查看项目将1改成0。 拉好后马上设定delegate,在文档大纲视图中,选择集合视图再重新按下ctrl +左键拖曳到viewController,选择delegate,再重复一次选择数据源。(当然用代码设定也是可以,看个人喜好) 接下来要设定我们想要自定的cell的格式,我本来是使用内建的cell再去修改的,但后来发现xib似乎比较好用,所以就用xib来创建cell,也可以顺便学一下xib 。 先New一个Cocoa Touch Class,子类为UICollectionViewCell,XIB那栏要打勾。 创建好之后就会多出xib档案和swift档,那先来设计我们的cell吧。先在cell里面拉一个视图出来。 设定View的约束条件,这边宽度要记得重置因为后面会用到,AspectRatio我也有勾。 接下来再把需要的元件拉进去并排好位置 再来设定各元件的约束,设定完后可以调整视图的背景色,可以帮助理解单元格的正确显示区域。 再来单击最上层的我的收藏夹视图单元格,在右边显示属性检查器的第一个收藏夹可重用视图栏位填上自己设置的标识符名称,像这边设定成myCell的话,文档大纲视图的我的收藏夹视图单元格就会改名成myCell。 接下来要建立xib和myCollectionViewCell.swift档案之间的连结,在该档案加入以下的代码: 到这里就完成xib的设定了,此时应该会会想要忍不住Run一下程式,但很不幸的crash了,这是因为viewController那边还有很多地方未设定。 回到ViewController.swift,给StoryBoard上的收藏视图设置ㄧ个插座 iPhone SE 大尺吋平板和最小手机都试过了,经过以萤幕宽度的计算,来达到一次显示两行单元,而且大小会自动缩放,那其他型号应该也没问题了吧! 范例档网址: ttyUSB0978 / customCollectionViewTest customCollectionViewTest – https://medium.com/@ttyUSB0978/ios-swift-custom-uicollectionview-880df6abcc51 github.com 参考资料: UICollectionView具有在iOS 9和10中使用自动布局自动调整单元格大小的功能 相关资料: WWDC2016会议笔记— iOS 10 UICollectionView新特性 Swift —圆形图片的生成及显示(两种方式) Swift:用UICollectionView整一个瀑布流 PS。 demo用的图片是我之前在网路上收集的,如果作者看到觉得不OK请通知我,我再换掉

在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上的想法。