iOS开发之资讯类App常用分类控件的封装与实现(CollectionView+Swift3.0+)
今天博客中,我们就来实现一下一些常用资讯类App中常用的分类选择的控件的封装。本篇博客中没有使用到什么新的技术点,如果非得说用到了什么新的技术点的话,那么勉强的说,用到了一些iOS9以后UICollectionView添加的一些新的特性。本篇博客所涉及的技术点主要有UICollectionView的Cell移动,手势识别,控件封装,闭包回调,面向接口编程,Swift中的泛型等等。这些技术点在之前的博客中也多次使用到,只不过本篇博客使用这些技术点来完成我们的具体需求。
一、实例运行效果
先入为主,下方这个效果,就是本篇博客所涉及Demo的运行效果。当然下方的效果是一些资讯类App中选择分类时,常用的部分。主要还是对UICollectionView的使用。当然,下方效果的实现,网上也不乏相应的实例。虽然本篇博客的效果与其他类似的效果类似,但是代码设计以及结构实现时还是有所区别的。下方效果的实现使用了iOS9以后的UICollectionView才支持的更新Cell的方法,稍后会详细介绍到。当然,本篇博客我们依然使用Swift3.0来实现的。
在之前的博客中,我们系列的介绍了UICollectionView的各种回调,以及如何自定义CollectionView的布局,并给出了如何使用CollectionView自定义瀑布流。关于之前的博客请移步于《UICollectionView详解系列》。

我们可以使用Reveal来查看上述效果的层级关系。下方就是我们使用Reveal来查看的效果。从下方的效果中我们不难看出,该页面的实现并不复杂。主要还是对UICollectionView的使用。

上面这个效果就是我们今天博客中所实现的效果,而下方这两个效果是我们之前在聊UICollectionView以及自定义布局时所给出的相应的Demo, 下方的Demo所对应的源码也在Gitbub上进行了分享。还是那句话,今天博客的内容依然是对UICollectionView的应用。
UICollectionView这个控件是非常强大的,之所以强大,源于其可定制性比较高,灵活多变。

二、控件的调用
我们将上述分类选择的控件进行了封装,接下来,我们将会给出其初始化和调用的方式。下方就是我们所封装控件的调用方式,下方的二维数组dataSource就是我们所封装控件中的CollectionView中的数据源,该数据源中的数据项要遵循我们指定的CEThemeDataSourceProtocal协议。稍后我们会给出该协议中所以对应的内容。
DataSourceTools类中的createDataSource()类方法就负责创建我们需要的测试数据。数据源创建好后,在实例化CESelectThemeController对象时,将相应的数据源传给我们的控件即可。然后给控件的对象设置更新数据源的闭包回调,也就是说,当我们使用该封装的控件对DataSource操作完毕后,会执行下方的闭包回调,将更新后的数据源传给调用者。如下所示:

CEThemeDataSourceProtocal协议就规范了数据源中的数据项必须要实现的方法,下方就是CEThemeDataSourceProtocal协议的实现代码。当然该协议的代码实现比较简单,就一个menuItemName()方法,该方法的返回值是一个字符串。该字符串就是我们要在Cell上显示的Menu的名字。

下方就是创建我们的数据项的测试数据相关代码。下方的MeteData类就是我们要在上述控件测Cell中显示的数据。该类实现了CEThemeDataSourceProtocal协议,并给出了menuItemName()的方法实现。
在DataSourceTools中的createDataSource()方法中负责创建我们的测试数据,通过循环实例化MeteData并存入二维数组中,并将该二维数据组进行返回。该方法返回的二维数组就是我们需要的数据源。

三、控件核心代码介绍
上面我们简单介绍了该控件的调用方式,接下来我们来看一下该控件的核心代码的实现。说吧了,就是长按手势识别以及CollectionView的Cell的移动。下方我们将详细的介绍一下该控件的核心代码的实现。
1. UICollectionViewDataSource
下方就是该控件中使用UICollectionView的DataSource的代理方法。前面几个我们之前介绍过的代理方法就不做过多赘述了,下方两个画框的就是本篇博客的主角,一个是开启Cell移动的代理方法,另一个是移动后更新数据源的方法,具体如下所示。

2、为CollectionView添加长按手势
接下来要做的就是给CollectionView添加LongPressGestureRecognize。addGestureRecognizer()方法负责为我们的CollectionView添加长按手势,longPress()方法就是该长按手势所触发的方法。手势开始时,我们调用longPressBegin()方法。手势改变时,我们调用longPressChange()方法。手势结束时,我们调用longPressEnd()。这三个方法是本篇博客的关键,下方会具体给出其实现方式。

3、longPressBegin()方法的实现
下方是长按手势开始时所触发的方法,首先根据触摸的点来获取该点所在cell的IndexPath。如果该Cell不是第一个Section中的Cell, 那么就不触发手势开始的事件,因为我们规定只有第一个Section中的Cell才有长按拖动手势。
如果Cell符合我们的要求,我们就调用UICollectionView的beginInteractiveMovementForItem()方法来启动移动Item功能。当然,该方法是iOS9以后才添加的。启动后我们将当前的Cell隐藏,然后将当前的Cell生成快照,让后让该快照跟着我们的手指移动即可。具体代码如下所示:

4、longPressChange()方法的实现
下方方法就是手指移动时所触发的方法,该方法的代码比较简单,主要是改变我们快照的坐标,让Cell的快照随着手指的移动而移动。然后再调用updateInteractiveMovementTargetPosition()。调用该方法时,会执行DataSource代理中更新数据源的代理方法,也就是上面DataSource代理方法中最后一个更新数据源的方法。

5、longPressEnd()方法实现
该方法的主要功能是在手势结束后做一些善后工作,如结束移动,然后移除掉Cell的快照并显示隐藏掉的cell。具体如下所示:

今天的博客就先介绍到这儿吧,上面只是本篇博客所涉及Demo的一小部分代码,完整的代码请移步于下方的github分享链接。
github代码分享链接:https://github.com/lizelu/CESelectThemes
iOS开发之资讯类App常用分类控件的封装与实现(CollectionView+Swift3.0+)的更多相关文章
- iOS开发之常用资讯类App的分类展示与编辑的完整案例实现(Swift版)
上篇博客我们聊了<资讯类App常用分类控件的封装与实现(CollectionView+Swift3.0)>,今天的这篇博客就在上篇博客的基础上做些东西.做一个完整的资讯类App中的分类展示 ...
- iOS开发~视图(UIView)与控件(UIControl)
1.UIView类 1.什么是视图 看得见的都是视图 2.什么是控件 一种特殊的视图,都是UIControl的子类,不仅具有一定的显示外观,还能响应高级事件,与用户交互.严格意义上UILabel不是控 ...
- IOS开发-UI学习-使用UIImageView控件制作动画
先添加40张tomcat的图片到资源列表中:名称为cat_eat0000.jpg到cat_eat0039.jpg. 1.定义所需控件 // 定义按钮,图片控件.可变数组对象 UIButton *act ...
- IOS第八天(6:UITableViewController新浪微博, 模型和 控件位置封装一起statusFrame)
*****HMViewController #import "HMViewController.h" #import "HMStatus.h" #import ...
- IOS开发-OC学习-常用功能代码片段整理
IOS开发-OC学习-常用功能代码片段整理 IOS开发中会频繁用到一些代码段,用来实现一些固定的功能.比如在文本框中输入完后要让键盘收回,这个需要用一个简单的让文本框失去第一响应者的身份来完成.或者是 ...
- Android音乐、视频类APP常用控件:DraggablePanel(1)
Android音乐.视频类APP常用控件:DraggablePanel(1) Android的音乐视频类APP开发中,常涉及到用户拖曳视频.音乐播放器产生一定交互响应的设计需求,最典型的以You ...
- Android音乐、视频类APP常用控件:DraggablePanel(2)
Android音乐.视频类APP常用控件:DraggablePanel(2) 附录文章1主要演示了如何使用DraggablePanel 的DraggableView.DraggablePanel ...
- 【风马一族_Android】第4章Android常用基本控件
第4章Android常用基本控件 控件是Android用户界面中的一个个组成元素,在介绍它们之前,读者必须了解所有控件的父类View(视图),它好比一个盛放控件的容器. 4.1View类概述 对于一个 ...
- 【IOS界面布局】横竖屏切换和控件自适应(推荐)
[IOS界面布局]横竖屏切换和控件自适应(推荐) 分类: [MAC/IOS下开发]2013-11-06 15:14 8798人阅读 评论(0) 收藏 举报 横竖屏切换 自适应 第一种:通过人为的办法改 ...
随机推荐
- leetcode水题(一)
Two Sum 1 public int[] twoSum(int[] numbers,int target){ Map<Integer,Integer> map = new HashMa ...
- 第二章、元组和列表(python基础教程第二版 )
最基本的数据结构是序列,序列中每个元素被分配一个序号-元素的位置,也称索引.第一个索引为0,最后一个元素索引为-1. python中包含6种内建的序列:元组.列表.字符串.unicode字符串.buf ...
- 04(1) 基于上下文相关的GMM-HMM声学模型1
1.上下文对音素发音的语谱轨迹的影响 受到上下文的影响,同一个音素的发音语谱轨迹不同 为提高识别准确率,对音素建模时应将这种上下文影响考虑在内 2.基于上下文相关的音素建模 注意,非单音素建模中,每个 ...
- 原生js实现数据双向绑定
最近接触了vue,在谈到vue等等的mvvm框架之前,先了解什么是数据双向绑定以及如何利用原生JS实现数据双向绑定 单向数据绑定 指先把模板写好,然后把模板和数据(数据可能来自后台)整合到一起形成HT ...
- java集合系列
工作以来,一直对java集合理解的不够全面,不够深入,就是常用的ArrayList/HashMap/Set/List,有时候会用一下LinkedList.一时兴起,可能对TreeSet,HashSet ...
- 最简单的html5语言
什么是 HTML5? HTML5 是下一代 HTML 标准. 最小的HTML5文档 下面是一个简单的HTML5文档: <</span>!DOCTYPE html><< ...
- 微信公众号开发笔记3-sdk接入(nodejs)
另一个2小时 access_token是需要2小时更新一次,在这里,又引入了一个2小时获取一次的字段,这个字段是: jsapi_ticket,这个字段是接入sdk的前提.与access_token类似 ...
- 在Centos7 更改Docker默认镜像和容器的位置
图片出处:https://bobcares.com/wp-content/uploads/docker-change-directory.jpg 一.Why? 通常,当你开始使用docker时,我们并 ...
- java下蛇形回环矩阵的实现
前文废话:这个问题据说是腾讯之前的一道笔试题,由于当时没认真看,现在记不清这种矩阵是不是叫"蛇形回环矩阵"......请大家直接看图1,就是那个样子的矩阵. 问题描述:输入一个N, ...
- python小工具:用python操作HP的Quality Center
背景是这样的:这个组的测试人员每跑一个case都要上传测试结果附件到QC.每个待测功能模块可能包含几十上百的case.于是手工上传测试结果变成了繁重的体力劳动.令人惊讶的是我们的工具开发组竟然说做不了 ...