Tag: collectionview

iOS 10 —使用预提取API滚动UICollectionViewDataSourcePrefetching

以下讨论的所有内容均来自此WWDC视频 。 这个长达35分钟的视频包含有关UICollectionView增强功能的所有详细信息,并解释了为什么添加此Pre-Fetch API,现有的滚动体验,帧掉落等问题是什么? 所以现在,让我们进入理论, 随着开发的任何移动应用程序用户规模的增长,该应用程序能够承受各种网络呼叫,各种设备和屏幕尺寸变得越来越重要。 理想情况下,每个应用程序都需要交付即时的内容交付,不丢帧(或不浪费网络数据)。 为了实现这一目标,我想通过“后台预取”(已经通过在各种应用程序中使用不同的机制来解决这一问题!)是打破所有其他依赖关系并平稳运行/滚动的方式。 用“ Background pre-fetching”(背景预先提取)一词,这是不言而喻的,任何移动应用程序都应该在后台提取足够的数据,并准备好将它们预先显示在屏幕上,从而可以流畅地观看内容。 在分析任何应用程序时,滚动时通常会由于以下原因而导致内容下降或滞后: 1.网络可用性 网络连接将会频繁下降,因此移动应用必须提出一种不同的实时获取内容的策略。 如果我们以相同的次数定位许多用户,则移动应用程序必须处理网络带宽速度。 2.切换连接类型 移动应用必须观察其用户sim或wifi或两者之间的切换的不同使用模式。 根据用户已在其移动应用程序中连接的连接,内容将显示得更快或更慢。 3.没有互联网连接 如果移动应用程序完全失去了互联网连接怎么办? 是否向用户显示提示说没有互联网连接(或),一个带有加载/刷新图标的占位符单元足够,以便在互联网连接重新打开时重新加载,是否很好? 从任何移动角度来看,它将是以下两个选项之一: 1. 脱机数据处理 ,以从应用程序的数据库中获取并显示先前获取的内容。 2. 缓存机制 ,我们在其中缓存内容并显示它们。 现在,如果没有先决条件,所有条件都得到满足,但移动应用程序仍然没有流畅的滚动体验,该怎么办? 在iOS 10上,Apple引入了“ 数据预取 ”概念及其相关的API后,在UICollectionView和UITableView中都可以在后台线程中预取数据以体验流畅的滚动体验,它确实有效! 操作系统负责在后台获取其他数据。 在直接进入API方法之前,让我们看一下iOS 9中UICollectionView的生命周期: 1. collectionView(_:cellForItemAt 🙂 -单元格将进入带有内容的可见区域。 2. collectionView(_:willDisplay:forItemAt 🙂 -单元格进入带有内容的可见区域。 3. collectionView(didEndDisplaying:forItemAt 🙂 -单元格在可见字段之外。 现在,iOS 10中的UICollectionView的生命周期: 它与iOS 9相似,但是按照Apple的解释,操作系统更早地调用collectionView(_:cellForItemAt 🙂 ,这意味着,即使在需要显示单元格之前,也可以完成所有繁重的工作。 另一个是,使用iOS […]

TableView / CollectionView单元格的索引

获取选定单元格的索引是一件容易的事,但是我已经看到很多实现都使用非常奇怪的方法来获取选择的实现,特别是在单元格具有许多按钮/动作来获取其索引的情况下。 让我们回到基础,如何获取选定单元格的索引? 通过简单地实现tableview / collection视图委托 func collectionView(_ collectionView:UICollectionView,didSelectItemAt indexPath:IndexPath){}或:func tableView(_ tableView:UITableView,didSelectRowAt indexPath:IndexPath){} 这些是从用户那里进行选择的基本方法,但是如果我在单元格中只有一个按钮该怎么办? 我认为不必担心按钮,使其对触摸没有反应并让上述选择代表为您处理该按钮是不值得的! 但是,如果我想要该特定按钮怎么办? 如果我有多个按钮可以触发业务逻辑中的多个操作? 这就是处理视图中的触摸并将通知它的两种方法的地方:委托和闭包! 我自己发现,闭包是将视图连接到其父级的一种非常不好的方式,而且开发人员往往会忘记使用弱的或未使用的方式,以阻止两个类相互引用,从而容易导致内存泄漏。 因此,我相信代理人提供了更方便,更清晰的方式来轻松显示交互,更易于阅读,修复甚至通过您的应用进行通用。 要使用委托,人们会将indexPath作为变量发送到单元格,因此它知道它在其控制器内的位置,这是一个后果,因为现在视图知道的内容比其应了解的更多。 通过一个简单的函数调用就可以很容易地从管理它的集合/表视图中获取该信息: tableView.indexPath(for:UITableViewCell) 因此,我们为此目的编写一个协议:通过用户交互通知控制器。 协议TableViewCellDelegate:类{func didSelect(_ cell:UITableViewCell,_ button:UIButton)} 集合怎么样? 协议CollectionViewCellDelegate:类{func didSelect(_ cell:UICollectionViewCell,_ button:UIButton)} 这个功能是您在不同单元格中所需的全部功能,现在它返回对单元格的引用以及在其中单击的按钮! 我们添加了类,因此可以在单元格中将其削弱: 弱var委托:TableViewCellDelegate? 将其添加到您的按钮操作中: @IBAction buttonTapped(_ sender:UIButton){委托?.didSelect(自己,sender) } 就是这样,现在使单元格委托引用您的控制器,并由您的控制器进行确认,现在您已经拥有所有选项卡并与表/集合单元格进行了交互! 扩展UIViewController:TableViewCellDelegate {func didSelect(_ cell:UITableViewCell,_ button:UIButton){保护let index = tableView.indexPath(for:cell)else {return} let tag = button.tag}} 在这里,我们确认它的viewController,获取索引,并获取按钮的标签以知道单击了哪个按钮,标签可以轻松地设置为0、1、2,具体取决于您单元格中有多少个按钮/动作。 […]

集合视图响应

塔梅纽斯·梅卢斯·梅斯莫 应用程序商店的气泡包装—缓解压力的应用商店,可在Apple Store上广泛使用,并在iOS上运行。 墨西哥人因通缉犯而死,西班牙人犯不信,西班牙人犯不信通行证,西班牙人不愿受贿。 Sendo assim,嵌套教程,多语言收藏,查看tamanho的术语,如telasdisponíveise to que funcione em todos dispositivos atualmente suportados。 Vale-se lembrar que essatécnicaéutilizada para quandovocênãotem umnúmerodeterminado decélulasdentro da suacoleção。 Criaçãodo Projeto eIntrodução。 Xcode e Crimeum简单应用程序项目的首字母缩略词。 没有备忘录,irei colocar CollectionResponsiva pois essaéa ideia do tutorial。 查看,安装或维护Main.storyboard和Substitua视图控制器Padrãopor uma Collection视图控制器。 (Neso seesqueçade colocar este Controller comicial,selecionando aopçãoa ser grifada na foto)。 Uma vez criado […]

带有自定义点框架的启动画面

使用启动画面在应用程序中越来越流行,特别是在应用程序的第一页中,向用户展示了应用程序的工作方式。 他们通常在底部有圆点。 我最近用自定义点创建了启动画面。 您可以将图像作为点。 通过使用此框架,您可以将视图放入应用程序的情节提要板中,并为其提供一些照片,然后使用自定义启动屏幕。 您可以在本文结尾处在您的应用程序中找到有关此框架的实现。 您可以从以下地址下载框架,并在您的代码中使用它: amirhossein828 / CustomSplashScreenWithCustomDots CustomSplashScreenWithCustomDots –使用启动屏幕在应用程序中越来越流行,特别是在… github.com中 首先,我将解释一些注意事项,然后我可以找到在情节提要中实现此框架的方式。 制作定制视图可能是最常用的方法,以编程方式将其全部制作出来,但是我决定通过xib文件对此定制视图进行查看。 我认为这样更容易。 只是有一些小提示应考虑: “ Nib文件在OS X和iOS中创建应用程序中扮演着重要角色。 使用nib文件,您可以使用Xcode而非编程方式以图形方式创建和操作用户界面。 “ 来自:https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/LoadingResources/CocoaNibs/CocoaNibs.html 1.通过Nib的功能,可以在故事板中工作时使用视图,只需要在类的init方法中加载xib文件即可。 如果要使其成为框架,则必须根据框架中定义的类将其加载到框架包中。 等一下,什么是捆绑包,那意味着什么? 捆绑 存储在磁盘上捆绑目录中的代码和资源的表示。 通过使用包对象,可以在不知道包结构的情况下访问包的资源。 主包代表包含当前执行代码的包目录。 因此,对于应用程序,主捆绑对象使您可以访问应用程序随附的资源。 您始终可以从已知的URL或路径创建包对象,但是其他方法可以更轻松地访问您的应用程序已在使用的包。 例如,如果链接到框架,则可以使用init(for :)方法基于该框架中定义的类来定位框架束。 ” 来自:https://developer.apple.com/documentation/foundation/bundle 因此,原因是主捆绑软件无法访问xib文件。 换句话说,主捆绑包内部没有这些xib文件。 如果以编程方式创建视图,则无需执行这些操作。 2.在启动应用程序时,了解执行方法的顺序很重要。 考虑此顺序将有很大帮助。 假设我们有一个带有viewDidLoad方法的视图控制器。 您的应用程序有一个xib文件,其中包含集合视图。 考虑使用init方法的xib文件,这是该视图的一种设置。 同样,集合视图方法在xib类文件所有者中。 您认为哪种方法将首先执行。 1. xib类文件所有者的第一个init方法被执行。 2.然后在视图控制器中添加viewDidLoad。 3.然后在xib类文件所有者中收集视图方法。 因此,就像我的案例一样,我需要从委托中获取一些信息(如多点图像和幻灯片),我必须在集合视图方法中而不是在init方法中获取委托的所有信息。

创建集合视图(Swift 3)

在此博客中,我将讨论如何实现简单的集合视图。 这简单! 集合视图是有序的布局显示,与表格视图相比,可以进行更多的自定义。 如果要以类似网格的方式显示多个图像,我希望在表视图上使用集合视图。 如果我只想显示一个简单的列表,则可以使用表格视图。 对于此博客,我将从iTunes RSS feed生成器中检索数据。 该应用程序将在iTunes中显示美国排名前10的有声读物。 步骤1:添加收藏夹视图 在Main.storyboard中 ,将集合视图拖到视图控制器上。 添加约束以使其与父视图的边缘对齐。 添加约束以使其与父视图的边缘对齐。 步骤2:将View Controller分配为Collection View的数据源。 请注意,我没有将View Controller分配为Collection View的委托,因为我只是在显示Collection View单元,并且不希望用户具有可突出显示与所显示的单元进行交互的任何功能。 步骤3:在ViewController.swift中 ,遵循UICollectionViewDataSource协议。 步骤4:在我们的ViewController.swift文件中创建一个集合视图的实例。 步骤5:创建一个CollectionViewCell.swift文件。 此CollectionViewCell.swift文件将具有用于UIImageView(用于书本图像)和UILabel(用于我们的书本标签)的出口。 在此类中,我们还将具有处理显示单元格内容的功能。 步骤6:在Main.storyboard中 ,选择集合视图单元,并将其类设置为“ CollectionViewCell”,然后将其设置为redirectIdentifier。 选中集合视图单元格后,在“ 属性”检查器中 ,将重用标识符标记为“ collectionViewCell”。 步骤7:将UIImageView和UILabel拖到集合视图单元格上。 根据需要约束它们。 步骤8:将UIImageView和UILabel连接到CollectionViewCell.swift文件中的相应属性。 步骤9:为有声读物创建数据模型。 创建一个名为Audiobook.swift的新文件,并标识此数据模型的属性。 请注意,我在“ coverImage”属性中将图像URL作为字符串输入。 Audiobook初始化程序将为每个Audiobook对象解析一个字典 。 步骤10:编写APIClient实现。 步骤11 :(可选)创建DataStore管理器类(单例)以处理根据返回的API JSON数据创建Audiobook对象的过程。 如下所述,我导入UIKit(因为我将书图像作为UIImages存储在此文件中)。 您可以看到我有一个有声读物数组和一个UIImage数组来存储这些要在集合视图中显示的对象。 这不是我最喜欢的组织对象的方式,但现在可以了。 您还将注意到,我有两个功能: getBooks(completion 🙂和getBookImages(completion 🙂 。 […]

如何创建像iOS 11 App Store这样的侧面偷看的单元格

集合视图的滚动和分页一直是我的一个谜。 直到最近,我们才有一个项目的需求,在该项目中,有一个集合视图显示了上一个和下一个项目的一部分。 因此,现在该深入研究实现此功能了。 我最终决定实现自己的逻辑并从中创建一个pod,以便可以轻松地将其集成到项目中。 该功能在此处可用: MaherKSantina / MSPeekCollectionViewDelegateImplementation MSPeekCollectionViewDelegateImplementation –一种自定义的分页行为,可在页面中窥视上一个和下一个项目 github.com 自述文件包含使之正常运行所需的所有必要信息。 为了方便起见,下面是一个示例: 如果您有兴趣了解MSPeekCollectionViewDelegateImplementation的内部工作原理,请继续下一节。 本节将介绍偷看委托实现的主要功能。 (此处未显示所有代码,但Github存储库中包含所有代码) 我们将不依赖集合视图中已经存在的分页行为,而是将实现自己的逻辑。 因此,“ Paging Enabled复选框将被取消选中。 布局: 这是一个显示视图的不同组件的图: 您可以使用委托函数为像元间距设置任何值: 我们可以使用委托函数来做到这一点: 在索引路径处插入段 由于单元格将占据剩余空间,因此我们可以设置单元格的项目大小,如下面的委托函数所示: 索引路径中项目的大小 由于有两个从侧面窥视的单元格,因此从左右两个单元格之间有两个空格,可以使用以下公式计算itemWidth: 让itemWidth = collectionView.frame.size.width-2 *(cellSpacing + cellPeekWidth) 如果集合视图的宽度小于peek +间距,则max函数仅用于防止出现负值。 为了安全起见,我们还将最小项目间距设置为0: 最小项目间距 逻辑: 我们将引入一个名为scrollThreshold的新参数。 这将确定需要多少滚动才能捕捉到相邻的单元格。 当用户开始使用以下命令拖动时,我们将通过保存滚动偏移量来计算滚动距离: 滚动视图将开始拖动 这是主要部分。 我们可以使用委托函数scrollViewWillEndDragging来实现逻辑。 滚动视图将结束拖动 让我们将其分为几个步骤: 我们从targetContentOffset指针获取滚动视图将停止拖动的目的地。 指针指向滚动视图将停止的位置。 更改此值将更改滚动视图停止的位置,并且它将自动为其设置动画,而无需进行任何额外的工作。 计算滚动的总距离。 检查滚动的幅度是否大于scrollThreshold并创建一个系数,该系数具有3个值(-1、0、1)之一。 这将被添加到当前索引中。 通过将偏移量除以项目宽度来获取当前索引 将在步骤3中检索到的系数添加到当前索引。 […]

收藏查看Swift 4-iOS11

今天,我们将在Swift 4 iOS 11 Xcode 9中讨论集合视图, 步骤1:建立新的Xcode专案 步骤2:创建MVC文件夹(Model View Controller) 在controller文件夹中,创建新的可可触摸快速文件(UIViewController),将其命名为MainVC,在View文件夹中,创建新的可可触摸快速文件(UICollectionViewCell) 步骤3:打开Main.Storyboard 从对象库拖动集合视图 将Class CollectionViewCell连接到我们的单元格 在单元格中添加名为proLbl Label,并通过单击将其连接,然后在键盘上按Control键并拖动到CollectionViewCell View中 步骤4:打开Controller — MainVC.swift 将UICollectionViewDataSource和UICOllectionViewDelegate添加到类中,然后添加这两个支持功能 func collectionView(_ collectionView:UICollectionView,numberOfItemsInSection部分:Int)-> Int { //返回section的行数。 } func collectionView(_ collectionView:UICollectionView,cellForItemAt indexPath:IndexPath)-> UICollectionViewCell { //返回配置的单元格对象。 } 添加一个数组变量以显示collectionViewCell中的数据 //创建一个包含我们的数据的数组 var array = [“第一个单元格”,“第二个单元格”,“第三个单元格”,“第四个单元格”,“第五个单元格”] 编辑numberOfItemsInSection函数以返回array.count func collectionView(_ collectionView:UICollectionView,numberOfItemsInSection部分:Int)-> Int { 返回array.count } 编辑cellForRowAt函数以返回单元格 func collectionView(_ collectionView:UICollectionView,cellForItemAt […]

在Swift3中,TableViewCell中的CollectionView并不平滑

在我的项目TableViewCell CollectionView不显示,我添加 cell.collectionView.reloadData() 在我的代码。 我添加后, CollectionView显示在TableViewCell ,但ScrollView不平滑。 如何解决这个问题呢。 如果有人有任何经验或想法帮助我。 谢谢。 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "homecell") as! HomeCategoryRowCell let mainThemeList = mainHomeThemeTable[(indexPath as NSIndexPath).row] DispatchQueue.main.async { cell.categoryTitle.text = mainThemeList.main_name cell.collectionView.reloadData() } return cell } CollectionView在我的项目中, extension HomeCategoryRowCell : UICollectionViewDataSource { func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: […]

如何通过在CollectionView中select一个单元格来更改图像

目前我正在从事一个项目,我的产品页面是这样的 在这里,我使用UIImageView来显示大图像,下面我使用CollectionView滚动一组图像。 我想从CollectionViewCell单击图像时相应地更改大图像。 由于这是我第一次使用这种function,所以我没有办法。 请有人给我一些build议。 谢谢。

Swift:didSelectItemAtIndexpath函数不工作的JSON

我有三个控制器。 在第一个CategoryCollectionViewController,下一个listTableViewController,最后有DescriptionCollectionViewController。 在控制器中完美地传递了json数据。 但我不知道什么代码我应该写在ListTableViewController的didSelectRowAt_indexPath函数。 第一个CategoryCollectionViewController override func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { let controller1 = ListTableView() controller1.product_id = arrCategory[indexPath.item].id! navigationController?.pushViewController(controller1, animated: true) } ** CategoryCollectionViewController Json网页文件** 第二个ListTableViewController override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { tell me please what code i have to write here for push ViewController } ListTableController和DescriptionCollectionViewController的json网页文件是一样的 只是不同的是product_image值必须在ListTableViewController的单元格中加载,all_images的值必须在DescriptionCollectionViewController的单元格中加载。