自定義表情鍵盤 - 一維乓序、二維隔箍、三維數(shù)組使用

自定義表情鍵盤
表情包含:默認谓娃、Emoji和浪小花
提供方式:bundle文件
框架結(jié)構(gòu):

自定義表情鍵盤.png
分析:
     目前有一維數(shù)組:
     - 默認表情    一共108個
     - emoji表情  一共80個
     - 浪小花      一共40個
     
     把以上的一維數(shù)組轉(zhuǎn)成二維數(shù)組
            
        表情分類:     每一個一維數(shù)組中包含元素個數(shù):      索引:
     
        默認表情       [20 20 20 20 20 8]           0 - 19 , 20 - 39 ..... ,100- 107
     
        emoji表情     [20 20 20 20 ]               0 - 19 , 20 - 39 , 40 -59
     
        浪小花         [20 20]                      0 - 19 , 20 - 39
代碼實現(xiàn):

① 因為表情信息會多次使用,所以提供一個全局訪問點,便于使用

    //全局訪問點(單例)
    static let sharedTool: JSEmoticonTool = JSEmoticonTool()

② 獲取表情包bundle路徑

    // 懶加載獲取Bundle
    lazy var emoticonBundle: NSBundle = {
        // 獲取bundle路徑
        let path = NSBundle.mainBundle().pathForResource("Emoticons.bundle", ofType: nil)!
        // 獲取bundle
        let bundle = NSBundle(path: path)!
        // 返回bundle
        return bundle
    }()

③ 提供一個公共方法,從bundle中的plist文件提取出一維數(shù)組

    // MARK: - 讀取plist文件中的數(shù)組,轉(zhuǎn)成模型一維數(shù)組
    private func getEmoticons(fileName: String) -> [JSEmoticonModel] {
        
        ///...Classes/Compose/View/Emoticon/Emoticons.bundle/Contents/Resources/emoji/info.plist
        // 讀取plist文件中的數(shù)組轉(zhuǎn)成模型一維數(shù)組
        
        // 文件路徑
        let file = emoticonBundle.pathForResource("\(fileName)/info.plist", ofType: nil)!
        // plist文件轉(zhuǎn)數(shù)組
        let array = NSArray(contentsOfFile: file)!
        
        // 創(chuàng)建可變臨時數(shù)組
        var tmpArr: [JSEmoticonModel] = [JSEmoticonModel]()
        // 遍歷Array
        for dict in array {
            
            // KVC 字典轉(zhuǎn)模型
            let element = JSEmoticonModel(dict: dict as! [String: AnyObject])
            
            // 保存模型
            tmpArr.append(element)
            
        }
        // 返回存放模型的一維數(shù)組
        return tmpArr
        
    }

補充

  • pathForResource獲取到的路徑并不完整,只能獲取到bundle的Resources文件夾,所以進行了拼接,得到完整的路徑
bundle_path.png
  • 并且bundle中存放的圖片無法直接通過轉(zhuǎn)模型后的圖片名直接使用,需要根據(jù)導入的bundle文件拼接完整路徑才可以
// 圖片表情
// 從模型中獲取補充的路徑名
let path = emoticonModel.path ?? ""
 // 從模型中獲取圖片的名稱
 let png = emoticonModel.png ?? ""
// 拼接圖片的全路徑
 let name = path + png               
let image = UIImage(named: name, inBundle: JSEmoticonTool.sharedTool.emoticonBundle, compatibleWithTraitCollection: nil)        
button.setImage(image, forState: UIControlState.Normal)

④ 根據(jù)公共方法懶加載表情數(shù)據(jù),得到的是一維數(shù)組

    // default 表情 : 一維數(shù)組
    lazy var defaultEmoticons: [JSEmoticonModel] = {
        return self.getEmoticons("default/")
    }()
    // emoji 表情 : 一維數(shù)組
    lazy var emojiEmoticons: [JSEmoticonModel] = {
        return self.getEmoticons("emoji/")
    }()
    // 浪小花 表情 : 一維數(shù)組
    lazy var lxhEmoticons: [JSEmoticonModel] = {
        return self.getEmoticons("lxh/")
    }()

⑤ 根據(jù)表情鍵盤布局規(guī)則,將一維數(shù)組轉(zhuǎn)二維數(shù)組

    // 顯示列數(shù)
    let EmoticonMaxCol = 7
    // 顯示行數(shù)
    let EmoticonMaxRow = 3
    // 每頁顯示的個數(shù)
    let EmoticonMaxCount = EmoticonMaxCol * EmoticonMaxRow - 1

每一頁顯示固定的表情個數(shù),所以需要將一維數(shù)組重新按照每頁顯示表情個數(shù)重新分組
遍歷每一個一維數(shù)組,將一維數(shù)組轉(zhuǎn)成二維數(shù)組

    // MARK: - 一維數(shù)組轉(zhuǎn)二維數(shù)組
    func getEmoticonsGroup(emoticons: [JSEmoticonModel]) -> [[JSEmoticonModel]] {
        
        // 計算頁數(shù)
        let pageCount = (emoticons.count + EmoticonMaxCount - 1) / EmoticonMaxCount
        
        // 創(chuàng)建一個臨時的可變的二維數(shù)組
        var tempArray:[[JSEmoticonModel]] = [[JSEmoticonModel]]()
        
        // 遍歷一維數(shù)組(正序) 截取一維數(shù)組
        for i in 0..<pageCount {
            
            // 位置和長度
            let loc = EmoticonMaxCount * i
            var len = EmoticonMaxCount
            
            // 避免數(shù)組越界
            if loc + len > emoticons.count {
                len = emoticons.count - loc
            }
            
            // 截取范圍
            let range = NSMakeRange(loc, len)
            
            // 數(shù)組的截取
            let arr = (emoticons as NSArray).subarrayWithRange(range) as! [JSEmoticonModel]

            // 保存一維數(shù)組
            tempArray.append(arr)
            
        }
        
        // 返回二維數(shù)組
        return tempArray
    }

⑥ 最后將得到的二維數(shù)組合成為三維數(shù)組

    // 表情 : 三維數(shù)組
    lazy var allEmoticons: [[[JSEmoticonModel]]] = {
        return [
            self.getEmoticonsGroup(self.defaultEmoticons),
            self.getEmoticonsGroup(self.emojiEmoticons),
            self.getEmoticonsGroup(self.lxhEmoticons)
                ]
    }()

這樣,再通過CollectionView分配數(shù)據(jù)時:
三維數(shù)組的長度 --> CollectionView --> NumberOfSection
二維數(shù)組的長度 --> CollectionView --> NumberOfItemInSection
一維數(shù)組的元素 --> CollectionView --> Cell所需數(shù)據(jù)

// 數(shù)據(jù)源方法
extension JSEmojiconPageView: UICollectionViewDataSource {
    
    func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int {
        
        return JSEmoticonTool.sharedTool.allEmoticons.count
    }
    func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        
        return JSEmoticonTool.sharedTool.allEmoticons[section].count
    }
    func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
        
        let cell = collectionView.dequeueReusableCellWithReuseIdentifier(collectionViewCellId, forIndexPath: indexPath) as! JSEmojiconPageViewCell
        cell.indexpath = indexPath
        
        cell.emoticons = JSEmoticonTool.sharedTool.allEmoticons[indexPath.section][indexPath.item]
        
        return cell
    }
    
    
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市蜒滩,隨后出現(xiàn)的幾起案子滨达,更是在濱河造成了極大的恐慌,老刑警劉巖帮掉,帶你破解...
    沈念sama閱讀 222,807評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異窒典,居然都是意外死亡蟆炊,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,284評論 3 399
  • 文/潘曉璐 我一進店門瀑志,熙熙樓的掌柜王于貴愁眉苦臉地迎上來涩搓,“玉大人污秆,你說我怎么就攤上這事∶粮剩” “怎么了良拼?”我有些...
    開封第一講書人閱讀 169,589評論 0 363
  • 文/不壞的土叔 我叫張陵,是天一觀的道長充边。 經(jīng)常有香客問我庸推,道長,這世上最難降的妖魔是什么浇冰? 我笑而不...
    開封第一講書人閱讀 60,188評論 1 300
  • 正文 為了忘掉前任贬媒,我火速辦了婚禮,結(jié)果婚禮上肘习,老公的妹妹穿的比我還像新娘际乘。我一直安慰自己,他們只是感情好漂佩,可當我...
    茶點故事閱讀 69,185評論 6 398
  • 文/花漫 我一把揭開白布脖含。 她就那樣靜靜地躺著,像睡著了一般投蝉。 火紅的嫁衣襯著肌膚如雪养葵。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,785評論 1 314
  • 那天墓拜,我揣著相機與錄音港柜,去河邊找鬼。 笑死咳榜,一個胖子當著我的面吹牛夏醉,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播涌韩,決...
    沈念sama閱讀 41,220評論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼畔柔,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了臣樱?” 一聲冷哼從身側(cè)響起靶擦,我...
    開封第一講書人閱讀 40,167評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎雇毫,沒想到半個月后玄捕,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,698評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡棚放,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,767評論 3 343
  • 正文 我和宋清朗相戀三年枚粘,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片飘蚯。...
    茶點故事閱讀 40,912評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡馍迄,死狀恐怖福也,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情攀圈,我是刑警寧澤暴凑,帶...
    沈念sama閱讀 36,572評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站赘来,受9級特大地震影響现喳,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜撕捍,卻給世界環(huán)境...
    茶點故事閱讀 42,254評論 3 336
  • 文/蒙蒙 一拿穴、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧忧风,春花似錦默色、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,746評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至缘厢,卻和暖如春吃度,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背贴硫。 一陣腳步聲響...
    開封第一講書人閱讀 33,859評論 1 274
  • 我被黑心中介騙來泰國打工椿每, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人英遭。 一個月前我還...
    沈念sama閱讀 49,359評論 3 379
  • 正文 我出身青樓间护,卻偏偏與公主長得像,于是被迫代替她去往敵國和親挖诸。 傳聞我的和親對象是個殘疾皇子汁尺,可洞房花燭夜當晚...
    茶點故事閱讀 45,922評論 2 361

推薦閱讀更多精彩內(nèi)容

  • 發(fā)現(xiàn) 關注 消息 iOS 第三方庫、插件多律、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,124評論 4 61
  • 不可描繪的未來 急促得很蒼白 而你緊張得像個小孩痴突。 風兒吹過,花也飄來 悄悄躲在櫥窗外看隔壁女孩 很可愛狼荞,你笑開了...
    墨蘇因閱讀 189評論 0 0
  • 現(xiàn)在有很多爬蟲框架辽装,比如scrapy、webmagic相味、pyspider都可以在爬蟲工作中使用拾积,也可以直接通過re...
    DaVinciDW閱讀 1,313評論 0 1
  • 2017年1月14日打卡 周六,陽光明媚的一天。風很涼殷勘。 雖然在陽臺上曬太陽不科學,但是真要去樓下全身暴露在寒風中...
    沈曼柔閱讀 215評論 3 2
  • 今天要說的這個女孩是我的“師傅”昔搂,大三的時候玲销,我在學校食堂水吧兼職,認識了她摘符,為什么我們能成為師徒呢贤斜? 因為我們同...
    曾琦閱讀 421評論 5 9