1. 程式人生 > >IOS-篩選功能之封裝重構

IOS-篩選功能之封裝重構

最近專案中用到篩選功能 具體效果圖如下

做這個之前 我先考慮到的是 每個Item 之間的演算法和自定義的每個Item樣式的UI,其次我們要考慮產品的業務邏輯以及點選展開後的Height和Top

自定義的View 也就是Item 就不多說了,很簡單.

1.我們整個白色的View 背景要滿足點選展開後的效果,也就是我們要隨著每個展開的高度做適應,首先我選擇用的是滾動檢視

2.篩選功能一般是一個按鈕點選觸發的,動畫特效在這也不多說,因為點選篩選後 下拉出來的介面每個第一個選項預設選中,所以我們要點選的時候就要知道對應的值

3.關於請求資料:我這裡選擇胖model的結構方式, 把使用到的結構體都丟到整體model  例子:   

                weakSelf.filterCondition = [[MYFilterConditionModel alloc] initWithJson:dict];

這樣就比較方便了一行就可以滿足我們接受所有伺服器返回的結構體或者陣列字典等等 4.建立每一個View 拿品牌來說,整個品牌(Title) + 下面排序的Item + 展開按鈕 都是一個整體View  每次都要去建立一個物件View 丟到陣列中 在從中抽取 5.改變 每個檢視之間的Height 和Top   and  scrollview 的 contentSize     改變height 和top 的核心程式碼如下:

- (void

)updateLayout

{

    CGFloat top = 0;

for (MYSearchFilterConditionView *filter inself.searchArray) {

        filter.top = top;

        filter.height = [filter getHeight];

        top += [filter getHeight];

    }

self.contentView.contentSize = CGSizeMake(self.contentView.width, top+18);

}

6,我們點選展開的時候觸發的也是上面所寫程式碼,因為一個方法就足以滿足我們的需求

7.因為我這裡的需求是 分品牌,價格 屬性 所以我採用列舉如下

typedefenum {

    MYSearch_Brand  = 0,    //品牌

    MYSearch_Price  = 1,    //價格區間()

    MYSearch_property         = 2,    //類別屬性

}MYSearchType;

一個類別可能有多個屬性,增加了功能的難度.

8.接下來來說一下 九宮格演算法,其實也不難,我們知道,每個Item 的的控制元件都要適應他其中的Title,適應寬度,並且我們要確定如果一個Item 超過了一個螢幕的寬度我們就要對其擷取,或者折行. 演算法如下: Item.width > self.width 如果我們的item 大於螢幕自身的寬度 我們就要進行處理

    leftPosition  = 16;

            item.left = leftPosition;

            colIndex = 1;

            rowIndex++;

            if (rowIndex >= 1) {

                topPosition += verticalGap + 28;

            }

            item.top = self.searchLaebl.bottom + topPosition;

            leftPosition +=item.width + horizationGap;

            if (self.isOpen == NO) {

                if (rowIndex >= 2) {

                    //此處對應 展開功能 

                    break;

                }else{

                    self.openView.hidden = YES;

                }

            }

        }else{

            colIndex++;

            item.left = leftPosition;

            leftPosition += item.width;

            if (colIndex >= 1) {

                leftPosition +=horizationGap;

            }

            item.top = self.searchLaebl.bottom + topPosition;

        }

        itemTag++;

        [item searchFilterItemAddTarget:selfaction:@selector(infoConditionClicked:) forControlEvents:UIControlEventTouchUpInside];

        [self.searchItemArrayaddObject:item];

        [self addSubview:item];


if (self.isOpen) {

        //此處是點選展開後的回收

    }


9.我們如何儲存 我們點選後的狀態值呢? 這裡我使用下標,因為我把所有的資料都存在一個數組中 裡面對應的很多結構體,我們可以使用這種方式判斷isKindOfClass這樣就很輕鬆的拿到我們要的 Item其中的資料,和對應的下標,然後我們再把所有選擇的 item 的ID 點選確定的時候一起傳遞過去就可以了.

有不太懂的的就給我留言吧,我有時間就會回覆噠.謝謝幫助我的人們 感謝你們!~~~~~

相關推薦

IOS-篩選功能封裝重構

最近專案中用到篩選功能 具體效果圖如下 做這個之前 我先考慮到的是 每個Item 之間的演算法和自定義的每個Item樣式的UI,其次我們要考慮產品的業務邏輯以及點選展開後的Height和Top 自定義的View 也就是Item 就不多說了,很簡單. 1.我們整個白色的V

iOS實戰演練封裝圖片在上文字在下的button以及相關問題

       廢話不多說,直接上程式碼: 封裝圖片在上文字在下 -(void)initButton:(UIButton*)btn{ //使圖片和文字水平居中顯示 btn.contentHorizontalAlignment = UIContr

ios開發技巧:相簿功能的實現

iOS開發相簿功能的實現即滾動檢視的實現(UI階段) --CoverFlow 現如今的生活中手機相簿,微信朋友圈等滾動檢視無處不在, 此外還有很多關於滾動檢視的APP也天天出現在我們的生活中,今天就來簡單介紹一下滾動檢視的方法和實現,即相簿的功能實現. 首先

輕鬆把玩HttpClient封裝HttpClient工具類(七),新增驗證碼識別功能

       這個HttpClientUtil工具類分享在GitHub上已經半年多的時間了,並且得到了不小的關注,有25顆star,被fork了38次。有了大家的鼓勵,工具類一直也在完善中。最近比較忙,兩個多月前的修改在今天剛修改測試完成,今天再次分享給大家。       驗

IOS中UISearchController搜尋框篩選功能實現

在之前的部落格中,我曾寫過一個搜尋框功能的一個實現!有時候,我們需要利用搜索框進行對資料的一個篩選,比如qq的聯絡人功能上面的搜尋篩選功能的實現! 廢話不多說,先直接上程式碼 首先我們建立一個繼承uitableview的控制器searchTableViewC

elasticsearch補全功能只補全篩選後的部分資料context suggester

官方文件https://www.elastic.co/guide/en/elasticsearch/reference/5.0/suggester-context.html   下面所有演示基於elasticsearch5.x和Python3.x   最近專案使用elasticsearch的補全功能時,需

JDBC06-----程式碼重構封裝DBCUtils工具類

一. 程式碼重構原則 之前的DAO操作,除了sql語句和set值不一樣,其它都一樣,有太多的重複程式碼。因此需要重構。 重構程式碼原則: 二. 抽取DML方法 1. 具體抽取成executeUpdate方法在每一個dao實現中 1 /** 2 * 重構DM

iOS經典講解實現App訊息推送功能(二)

作者:Loving_iOS 上一篇部落格iOS經典講解之實現App訊息推送功能(一)講解了實現訊息推送的的準備工作,接下來我們來講解第二部分的內容,實現具體的推送及程式碼示例。 訊息推送的第三方平臺有很多,這裡我們使用極光推送平臺,註冊極光推送平臺的賬號。 登陸後進入控

iOS開發總結block回撥以AFN為基礎封裝的網路請求操作類

1.#warning封裝網路請求類的好處 /**  *  1.專案存在問題,太依賴第三方框架。     2.為什麼要封裝網路請求:以後AFN升級,方法名改了,或者AFN淘汰了,直接改工具類就

iOS 面向協議方式封裝空白頁功能

為了良好的互動體驗,相信大家在對待scrollView無資料時的提示頁都會使用一些第三方來定製,最典型的就是使用DZNEmptyDataSet。但是每個介面都寫一堆與DZNEmptyDataSetDelegate,DZNEmptyDataSetSource

輕鬆把玩HttpClient封裝HttpClient工具類(九),新增多檔案上傳功能

       在Git上有人給我提Issue,說怎麼上傳檔案,其實我一開始就想上這個功能,不過這半年比較忙,所以一直耽擱了。這次正好沒什麼任務了,趕緊完成這個功能。畢竟作為一款工具類,有基本的請求和下載功能,就差上傳了,有點說不過去。好了,天不早了,咱乾點正事吧。     

ios靜態庫應用封裝控制元件庫

iPhone靜態庫應用之封裝控制元件庫教程是本文要介紹的內容,由於iPhone控制元件的極度匱乏和自定義元件在重用上的限制,在過去的專案中我們積累了大量的“純程式碼”元件——因為IB本身的限制,我們無法把這些元件封裝為IB元件庫(本來我們想通過分發xib檔案的方式重用這些元

IOS 系統自帶的分享功能 UIActivityViewController

關於系統自帶的分享功能 主要是在與這個類 UIActivityViewController 先上效果圖 然後呢 直接上程式碼 大家都懂的 ^&^ //分享的標題 NSS

ios開發拍照功能裝置前後攝像頭切換

#import <AVFoundation/AVFoundation.h> #pragma mark - 攝像頭和相簿相關的公共類 // 判斷裝置是否有攝像頭 - (BOOL)

JavaWeb網上圖書商城完整項目--day02-6.ajax校驗功能頁面實現

ret code 需要 gis 提交 ima date else back 1 、現在我們要在regist.js中實現ajax的功能,使用用戶名到後臺查詢是否註冊,郵箱是否到後臺註冊,驗證碼是否正確的功能 我們來看regist.js的代碼 //該函數在html文檔加載完成

iOS項目蘋果審核被拒

att orm chart nali art rim screen 例如 pps 被拒情況一: 3. 2.2 BUSINESS: OTHER BUSINESS MODEL ISSUES - UNACCEPTABLE Business - 3.2.2 Your app

iOS安全攻防結構體保護使用

fff n) cnblogs 調用 hook hang ras evel amp   Objective-C 代碼很容易被 hook,因此需要對一些重要的業務邏輯進行保護,可以改用結構體的形式,把函數名隱藏在結構體裏,以函數指針成員的形式存儲。這樣編譯後只留了下地址,去掉了

iOS逆向工程App脫殼

工程 脫殼 一、生成dumpdecrypted.dylib動態庫首先我們要生成“砸殼”用的動態庫dumpdecrypted.dylib,我們“砸殼”時主要用到這個動態庫。該動態庫的源碼在github上是開源的(Github地址),要想得到dumpdecrypted.dylib這個動態庫,只需要從git

iOS逆向工程Hopper中的ARM指令

工程一、Hopper中的ARM指令ARM處理器就不多說了,ARM處理器因為低功耗等原因,所以大部分移動設備上用的基本上都是ARM架構的處理器。當然作為移動設備的Android手機,iPhone也是用的ARM架構的處理器。如果你想對iOS系統以及你的應用進一步的了解,那麽對ARM指令集的了解是必不可少的,ARM

iOS安全攻防使用 Frida 繞過越獄設備檢測

檢測 攻防 -i blog 越獄 工具 分析工具 href 設備   Frida 是 一款有趣的手機應用安全分析工具。   文章參考:Bypass Jailbreak Detection with Frida in iOS applications      iOS安全攻防