iOS開發之資訊類App常用分類控制項的封裝與實現(CollectionView+Swift3.0+)

来源:http://www.cnblogs.com/ludashi/archive/2017/06/13/6638942.html
-Advertisement-
Play Games

今天博客中,我們就來實現一下一些常用資訊類App中常用的分類選擇的控制項的封裝。本篇博客中沒有使用到什麼新的技術點,如果非得說用到了什麼新的技術點的話,那麼勉強的說,用到了一些iOS9以後UICollectionView添加的一些新的特性。本篇博客所涉及的技術點主要有UICollectionView的 ...


今天博客中,我們就來實現一下一些常用資訊類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

下方就是該控制項中使用UICollectionViewDataSource的代理方法。前面幾個我們之前介紹過的代理方法就不做過多贅述了,下方兩個畫框的就是本篇博客的主角,一個是開啟Cell移動的代理方法,另一個是移動後更新數據源的方法,具體如下所示。

  

 

2、為CollectionView添加長按手勢

接下來要做的就是給CollectionView添加LongPressGestureRecognizeaddGestureRecognizer()方法負責為我們的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

  


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Android學習筆記目錄 ...
  • 前不久 項目 終於成功發佈上線了,最近就在給項目做優化,併排除一些線上軟體的 bug,因為項目中使用了友盟統計,所以在友盟給出的錯誤信息統計中能比較方便的找出客戶端異常的信息,可是很多像數組越界卻只給出了 *** -[__NSArrayM objectAtIndex:]: index 50 beyo ...
  • //獲得當前時間並且轉為字元串 //獲取當前時間轉為時間戳 //13位時間戳1469193006001(毫秒)轉 系統時間2016-08-11 08:55:36 如果只獲取當前的年月日,用NSDate 直接截取是不對的,以下方法提供了獲取當前的年月日等等 ...
  • 一般在使用RecyclerView的時候不免要修改RecyclerView的數據,使用notifyDataSetChanged()來刷新界面,但是當數據比較多,而只是修改了一點的數據,或者刷新比較頻繁,這樣就會導致界面的卡頓問題,用戶交互特別不好。 這個時候就需要只是修改需要修改的數據,不要將數據全 ...
  • 首先看一個API:setMaskFilter(MaskFilter maskfilter): 設置MaskFilter,可以用不同的MaskFilter實現濾鏡的效果,如濾化,立體等。 以下有兩個MaskFilter的子類可供選擇: BlurMaskFilter:指定了一個模糊的樣式和半徑來處理Pa ...
  • 微信小程式中不能直接操作window對象,document文檔,跟html的樹結構不相同。 實現類似導航的隱藏顯示,如圖效果: 點擊網路顯示或隱藏網路中包含的內容。其他類似。 如果是jquery很方便實現,能直接操作document。在微信小程式中實現思路是:在邏輯層定義變數,通過setData賦值 ...
  • 1、創建通知,最好在viewDidLoad的方法中創建 2、發送通知 3、移除通知,由那個控制器創建由那個控制器移除,誰創建誰移除,最好在dealloc方法中移除,如果通知不能及時的移除掉,當下次進入該控制器時會重覆創建NSNotificationCenter,在對應方法中發送通知給上一次創建的通知 ...
  • 多線程是程式開發中非常基礎的一個概念,大家在開發過程中應該或多或少用過相關的東西。同時這恰恰又是一個比較棘手的概念,一切跟多線程掛鉤的東西都會變得複雜。如果使用過程中對多線程不夠熟悉,很可能會埋下一些難以預料的坑。 iOS中的多線程技術主要有NSThread, GCD和NSOperation。他們的 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...