QQ 抽屜樣式左右側(cè)滑菜單-QDrawerController

QQ 抽屜樣式左右側(cè)滑菜單-QDrawerController
之前項目中實現(xiàn)抽屜樣式左右側(cè)滑菜單都是在使用 MMDrawerController长捧,一個輕量、使用簡單的框架盒发,向經(jīng)典致敬!
在重構(gòu)老項目時要使用 swift 語言脖祈,就想著用swift實現(xiàn)這個這功能年局,在學(xué)習(xí)了 MMDrawerController 源碼和一些博客文章际看,決定動手。

實現(xiàn)思路
  • 在 QDrawerController 中使用 addChildViewController 方法矢否,添加左中右三個ViewController并調(diào)整響應(yīng)初始坐標(biāo)位置仲闽。
    圖層順序:window -> QNavigationController -> leftViewController ->centerViewController -> rightViewController
  • QNavigationController view 添加邊緣側(cè)滑手勢,以手勢滑動的值控制頁面的 x 軸僵朗。
  • centerViewController 添加遮罩層赖欣,透明度根據(jù)手勢滑動值控制
效果

上圖
QDrawerController.gif
  • 效果還可以,由于使用 QDrawerController 為基礎(chǔ)層验庙,會影響到 StatusBar 的自定義設(shè)置顶吮,所以需要 childViewControllerForStatusBarStyle 返回對應(yīng)的 ViewController,
// MARK: - 狀態(tài)欄變化處理 ******************
    enum QDrawerSide {
        case none
        case left
        case right
    }
    private var openSide: QDrawerSide? = QDrawerSide.none {
        didSet{
            setNeedsStatusBarAppearanceUpdateIfSupported()
        }
    }
    override var childViewControllerForStatusBarStyle: UIViewController? {
        return getTopViewController()
    }
    override var childViewControllerForStatusBarHidden: UIViewController? {
        return getTopViewController()
    }
    private func childViewControllerForSide(drawerSide: QDrawerSide) -> UIViewController {
        switch drawerSide {
        case .left:
            return leftDrawerVC!
        case .right:
            return rightDrawerVC!
        case .none:
            return centerVC!
        }
    }
    private func setNeedsStatusBarAppearanceUpdateIfSupported() {
        if responds(to: #selector(setNeedsStatusBarAppearanceUpdate)) {
            self.perform(#selector(setNeedsStatusBarAppearanceUpdate))
        }
    }
    private func getTopViewController() -> UIViewController {
        if self.childViewControllerForSide(drawerSide: openSide!) == centerVC {
            if centerVC is UITabBarController {
                for vcs in (centerVC?.childViewControllers)! {
                    if vcs is UINavigationController {
                        return (vcs as! UINavigationController).topViewController!
                    } else {
                        return vcs
                    }
                }
            } else if centerVC is UINavigationController {
                return (centerVC as! UINavigationController).topViewController!
            } else {
                return self.childViewControllerForSide(drawerSide: openSide!)
            }
        }
        return self.childViewControllerForSide(drawerSide: openSide!)
    }

完美解決 StatusBar 的自定義設(shè)置。因為使用了幾個手勢粪薛,所以需要特別處理一下手勢的沖突問題(就不上代碼了悴了,看源碼吧)。

使用

使用起來很簡單

初始化方法
init(centerVC: UIViewController, leftDrawerVC: UIViewController, maxLeftDrawerWidth: CGFloat)
init(centerVC: UIViewController, rightDrawerVC: UIViewController, maxRightDrawerWidth: CGFloat)
init(centerVC: UIViewController, leftDrawerVC: UIViewController, maxLeftDrawerWidth: CGFloat, rightDrawerVC: UIViewController, maxRightDrawerWidth: CGFloat)
設(shè)置 centerViewController
open func setCenterVC(newCenterVC: UIViewController)
跳轉(zhuǎn)到某個頁面
open func didSelectedVC(didSelectedVC: UIViewController)
打開左側(cè)頁面
open func openLeftDrawer()
打開右側(cè)頁面
open func openRightDrawer()
  • 給 UIViewController 增加了 extension 汗菜,方便調(diào)用打開側(cè)頁面方法
// MARK: - UIViewController 擴(kuò)展让禀,方便調(diào)用 QDrawerController 
extension UIViewController {
    var q_drawerController: QDrawerController {
        var drawerController: QDrawerController?
        
        var parentVC = self.parent
        while parentVC != nil {
            if parentVC is QDrawerController {
                drawerController = parentVC as? QDrawerController
            }
            parentVC = parentVC?.parent
        }
        return drawerController!
    }
}

// 使用時如下
self.q_drawerController.openRightDrawer()
self.q_drawerController.setCenterVC(newCenterVC: UIStoryboard(name: "Main", bundle: nil).instantiateInitialViewController()!)
self.q_drawerController.setCenterVC(newCenterVC: BViewController())
self.q_drawerController.didSelectedVC(didSelectedVC: CViewController())
結(jié)語

QDrawerController 也很簡單,目前測試檢測未發(fā)現(xiàn) Bug陨界,但肯定會有考慮不周之處巡揍,請朋友們多多指正。
奉上源碼地址 QDrawerController

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末菌瘪,一起剝皮案震驚了整個濱河市腮敌,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌俏扩,老刑警劉巖糜工,帶你破解...
    沈念sama閱讀 222,590評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異录淡,居然都是意外死亡捌木,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評論 3 399
  • 文/潘曉璐 我一進(jìn)店門嫉戚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來刨裆,“玉大人,你說我怎么就攤上這事彬檀》校” “怎么了?”我有些...
    開封第一講書人閱讀 169,301評論 0 362
  • 文/不壞的土叔 我叫張陵窍帝,是天一觀的道長努潘。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么疯坤? 我笑而不...
    開封第一講書人閱讀 60,078評論 1 300
  • 正文 為了忘掉前任报慕,我火速辦了婚禮,結(jié)果婚禮上贴膘,老公的妹妹穿的比我還像新娘卖子。我一直安慰自己略号,他們只是感情好刑峡,可當(dāng)我...
    茶點故事閱讀 69,082評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著玄柠,像睡著了一般突梦。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上羽利,一...
    開封第一講書人閱讀 52,682評論 1 312
  • 那天宫患,我揣著相機(jī)與錄音,去河邊找鬼这弧。 笑死娃闲,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的匾浪。 我是一名探鬼主播皇帮,決...
    沈念sama閱讀 41,155評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼蛋辈!你這毒婦竟也來了属拾?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,098評論 0 277
  • 序言:老撾萬榮一對情侶失蹤冷溶,失蹤者是張志新(化名)和其女友劉穎渐白,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體逞频,經(jīng)...
    沈念sama閱讀 46,638評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡纯衍,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,701評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了苗胀。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片襟诸。...
    茶點故事閱讀 40,852評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖柒巫,靈堂內(nèi)的尸體忽然破棺而出励堡,到底是詐尸還是另有隱情,我是刑警寧澤堡掏,帶...
    沈念sama閱讀 36,520評論 5 351
  • 正文 年R本政府宣布应结,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏鹅龄。R本人自食惡果不足惜揩慕,卻給世界環(huán)境...
    茶點故事閱讀 42,181評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望扮休。 院中可真熱鬧迎卤,春花似錦、人聲如沸玷坠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽八堡。三九已至樟凄,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間兄渺,已是汗流浹背缝龄。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留挂谍,地道東北人叔壤。 一個月前我還...
    沈念sama閱讀 49,279評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像口叙,于是被迫代替她去往敵國和親炼绘。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,851評論 2 361