自定義表情鍵盤(pán)-上下聯(lián)動(dòng)

底部toolbar中,為button自定義type類(lèi)型(直接使用tag值也是可以的),在button的點(diǎn)擊事件中,執(zhí)行閉包,讓外界監(jiān)聽(tīng)button的點(diǎn)擊事件

// 定義一個(gè)常量(添加子控件時(shí),0的tag值默認(rèn)被占用,所以創(chuàng)建時(shí)最好添加一個(gè)系數(shù))
// 內(nèi)部創(chuàng)建button的時(shí)候,讓其加上一個(gè)中間值,調(diào)用閉包時(shí),再減去個(gè)中間值,這樣傳出去的Tag值和CollectionView的索引可以對(duì)應(yīng),外界不需要在進(jìn)行設(shè)置
let tmpvalue: Int = 1000
// 表情鍵盤(pán)類(lèi)型
enum JSEmoticonToolBarType: Int {
    case Default = 0        //默認(rèn)
    case Emoji = 1          //Emoji
    case Langxiaohua = 2    //浪小花
}
    // MARK: - Button點(diǎn)擊事件
    @objc private func buttonClick (button: UIButton) -> Void {
        
        // button的選中狀態(tài)
        if button == currentButton {
            return
        }
        button.selected = true
        currentButton?.selected = false
        currentButton = button
        
        buttonClickClosure?(type: JSEmoticonToolBarType(rawValue: button.tag)!)
        
    }

監(jiān)聽(tīng)按鈕點(diǎn)擊事件的閉包實(shí)現(xiàn)中,通過(guò)參數(shù)傳入button的Tag值,轉(zhuǎn)化為CollectionView Cell對(duì)應(yīng)的索引,跳轉(zhuǎn)到指定Cell,完成點(diǎn)擊按鈕調(diào)到指定表情分組

    // 接收toolbar中的哪個(gè)按鈕點(diǎn)擊
    toolbar.buttonClickClosure = {[weak self] (type: JSEmoticonToolBarType) -> () in
            
        // 根據(jù)button的type轉(zhuǎn)換為CollectionView的索引,跳轉(zhuǎn)到對(duì)應(yīng)分區(qū)的表情首頁(yè)
        let indexPath = NSIndexPath(forItem: 0, inSection: type.rawValue)
        self?.pageView.scrollToItemAtIndexPath(indexPath, atScrollPosition: UICollectionViewScrollPosition.Left, animated: false)
            
    }

滾動(dòng)CollectionView改變toolbar按鈕選中


    - 計(jì)算方式 (只試用于cell和item一樣大,即ItemSize均為0)
    - 當(dāng)前的collectionView界面上展示給用戶最多兩個(gè)cell
    - 相對(duì)于 collectionView 左側(cè)起點(diǎn)為O點(diǎn) 屏幕中心點(diǎn)x = 屏幕的寬度/ 2 + contentOffset.x
    - 由于cell貼在pageView 每個(gè)cell都有自己的frame
    - 如果判斷出 哪個(gè)cell的frame 包含屏幕的中心點(diǎn) 就代表它在屏幕中顯示區(qū)域占比大
    - 通過(guò)cell 和 collectionView 得到indexPath
    - indexPath 得到 section
    - section 0 1 2  viewWithTag  通過(guò)該方法 得到button  把button狀態(tài)發(fā)生改變

代碼:

extension JSEmoticonKeyBoardView: UICollectionViewDelegate {
    
    func scrollViewDidScroll(scrollView: UIScrollView) {
        
        // 屏幕中心點(diǎn)距離CollectionView左邊的距離
        let centerX = SCREENW / 2 + scrollView.contentOffset.x
        
        // 獲取當(dāng)前屏幕顯示的Cell
        let cellArr = pageView.visibleCells().sort { (cell1, cell2) -> Bool in
            
            return cell1.frame.origin.x < cell2.frame.origin.x
        }
        
        // 當(dāng)屏幕上顯示2個(gè)cell的時(shí)候
        if cellArr.count == 2 {
            
            // 取出Cell
            let firstCell = cellArr.first!
            let lastCell = cellArr.last!
            
            // 獲取占屏幕比例大的Cell
            var indexPath: NSIndexPath
            
            // 如果中心點(diǎn)在第一個(gè)cell中,代表第一個(gè)Cell占屏幕比例多
            if firstCell.frame.contains(CGPointMake(centerX, 0)) {
                
                indexPath = pageView.indexPathForCell(firstCell)!
                
            } else {
                
                indexPath = pageView.indexPathForCell(lastCell)!

            }
            // 滾動(dòng)CollectionView時(shí),改變toolbar下面按鈕的選中狀態(tài)
            toolbar.switchSelectedButton(indexPath.section + tmpvalue)
            
        }
                
    }
    
    
}

CollectionView 數(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
    }
    
    
}
效果圖.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末步咪,一起剝皮案震驚了整個(gè)濱河市胳岂,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌淘菩,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,039評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異涤伐,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)缨称,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)凝果,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人具钥,你說(shuō)我怎么就攤上這事豆村。” “怎么了骂删?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,417評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵掌动,是天一觀的道長(zhǎng)四啰。 經(jīng)常有香客問(wèn)我,道長(zhǎng)粗恢,這世上最難降的妖魔是什么柑晒? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,868評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮眷射,結(jié)果婚禮上匙赞,老公的妹妹穿的比我還像新娘。我一直安慰自己妖碉,他們只是感情好涌庭,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著欧宜,像睡著了一般坐榆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上冗茸,一...
    開(kāi)封第一講書(shū)人閱讀 51,692評(píng)論 1 305
  • 那天席镀,我揣著相機(jī)與錄音,去河邊找鬼夏漱。 笑死豪诲,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的挂绰。 我是一名探鬼主播屎篱,決...
    沈念sama閱讀 40,416評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼扮授!你這毒婦竟也來(lái)了芳室?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,326評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤刹勃,失蹤者是張志新(化名)和其女友劉穎堪侯,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體荔仁,經(jīng)...
    沈念sama閱讀 45,782評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡伍宦,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了乏梁。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片次洼。...
    茶點(diǎn)故事閱讀 40,102評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖遇骑,靈堂內(nèi)的尸體忽然破棺而出卖毁,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,790評(píng)論 5 346
  • 正文 年R本政府宣布亥啦,位于F島的核電站炭剪,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏翔脱。R本人自食惡果不足惜奴拦,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望届吁。 院中可真熱鬧错妖,春花似錦、人聲如沸疚沐。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,996評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)濒旦。三九已至株旷,卻和暖如春再登,著一層夾襖步出監(jiān)牢的瞬間尔邓,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,113評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工锉矢, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留梯嗽,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,332評(píng)論 3 373
  • 正文 我出身青樓沽损,卻偏偏與公主長(zhǎng)得像灯节,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子绵估,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評(píng)論 2 355

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