MMDrawerController使用簡介

一代赁、 MMDrawerController是一個輕量級的側(cè)邊欄抽屜控件,其支持左側(cè)抽屜和右側(cè)抽屜踊兜,可以很好的支持導(dǎo)航控制器竿滨,并且支持開發(fā)者對手勢和動畫進(jìn)行自定義

二、MMDrawerController的使用及相關(guān)設(shè)置 MMDrawerController的使用十分簡單,只需將中心視圖控制器和左邊欄視圖控制器傳入初始化方法即可完成MMDrawerController的創(chuàng)建于游。示例代碼如下:

UIViewController * leftViewController = [[UIViewController alloc]init];
leftViewController.view.backgroundColor = [UIColor redColor];UIViewController * rightViewController = [[UIViewController alloc]init];
rightViewController.view.backgroundColor = [UIColor greenColor];ViewController * centerViewController = [[ViewController alloc]init];
centerViewController.view.backgroundColor = [UIColor blueColor];
//創(chuàng)建控件
MMDrawerController * rootController = [[MMDrawerController alloc]initWithCenterViewController:centerViewController leftDrawerViewController:leftViewController rightDrawerViewController:rightViewController];
 MMDrawerController中還提供了兩個方法供開發(fā)者創(chuàng)建單側(cè)邊欄毁葱,如下:
//只創(chuàng)建帶左側(cè)邊欄的視圖控制器
-(id)initWithCenterViewController:(UIViewController *)centerViewController leftDrawerViewController:(UIViewController *)leftDrawerViewController;
//只創(chuàng)建帶右側(cè)邊欄的視圖控制器
-(id)initWithCenterViewController:(UIViewController *)centerViewController rightDrawerViewController:(UIViewController *)rightDrawerViewController; 
//MMDrawerController中也提供了許多屬性和方法供開發(fā)者進(jìn)行自定義的設(shè)置,其中可用屬性解析如下:
//設(shè)置左側(cè)邊欄的最大寬度 默認(rèn)280
@property (nonatomic, assign) CGFloat maximumLeftDrawerWidth;//設(shè)置右側(cè)邊欄的最大寬度 默認(rèn)280
@property (nonatomic, assign) CGFloat maximumRightDrawerWidth;
//這個是一個只讀屬性贰剥,用于獲取可見的左側(cè)邊欄寬度
@property (nonatomic, assign, readonly) CGFloat visibleLeftDrawerWidth;
//這個是一個只讀屬性倾剿,用于獲取可見的右側(cè)邊欄寬度
@property (nonatomic, assign, readonly) CGFloat visibleRightDrawerWidth;
//動畫速度,這個參數(shù)的意義是每秒移動多少單位 默認(rèn)為800/s
@property (nonatomic, assign) CGFloat animationVelocity;
//設(shè)置是否允許回彈效果蚌成,如果設(shè)置為YES前痘,當(dāng)使用手勢進(jìn)行側(cè)邊欄的開啟時會出現(xiàn)回彈效果
@property (nonatomic, assign) BOOL shouldStretchDrawer;
//獲取當(dāng)前開啟的側(cè)邊欄類型,MMDrawerSide枚舉如下:
/*typedef NS_ENUM(NSInteger,MMDrawerSide{
            MMDrawerSideNone = 0,//無側(cè)邊欄
            MMDrawerSideLeft,//左側(cè)邊欄
            MMDrawerSideRight, //右側(cè)邊欄
};
*/@property (nonatomic, assign, readonly) MMDrawerSide openSide;
//開啟側(cè)邊欄的手勢模式 MMOpenDrawerGestureMode枚舉意義如下
/*typedef NS_OPTIONS(NSInteger, MMOpenDrawerGestureMode){
            //沒有手勢 此模式為默認(rèn)模式
            MMOpenDrawerGestureModeNone = 0,
            //在導(dǎo)航欄上拖動時可以打開側(cè)邊欄
            MMOpenDrawerGestureModePanningNavigationBar = 1 << 1,
            //在中心視圖控制器的視圖上拖動時可以打開側(cè)邊欄          
            MMOpenDrawerGestureModePanningCenterView = 1 << 2,
            //在中心視圖控制器的視圖邊緣20個單位內(nèi)拖動時可以打開側(cè)邊欄
            MMOpenDrawerGestureModeBezelPanningCenterView = 1 << 3,
            //自定義手勢 需配合自定義手勢的方法使用
            MMOpenDrawerGestureModeCustom = 1 << 4,
            //所有模式兼容
            MMOpenDrawerGestureModeAll= MMOpenDrawerGestureModePanningNavigationBar |MMOpenDrawerGestureModePanningCenterView |MMOpenDrawerGestureModeBezelPanningCenterView |MMOpenDrawerGestureModeCustom,
};*/
@property (nonatomic, assign) MMOpenDrawerGestureMode openDrawerGestureModeMask;
//關(guān)閉側(cè)邊欄的手勢模式 MMCloseDrawerGestureMode枚舉的意義如下
/*typedef NS_OPTIONS(NSInteger, MMCloseDrawerGestureMode) {
            //沒有關(guān)閉手勢
            MMCloseDrawerGestureModeNone= 0,
            //在導(dǎo)航欄上拖動時可以關(guān)閉側(cè)邊欄  
            MMCloseDrawerGestureModePanningNavigationBar= 1 << 1,
            //在中心視圖控制器上推動時可以關(guān)閉側(cè)邊欄    
            MMCloseDrawerGestureModePanningCenterView= 1 << 2,
            //在中心視圖控制器邊緣20單位內(nèi)拖動是可以關(guān)閉側(cè)邊欄        
            MMCloseDrawerGestureModeBezelPanningCenterView= 1 << 3,
            //點(diǎn)擊導(dǎo)航欄時可以關(guān)閉側(cè)邊欄  
            MMCloseDrawerGestureModeTapNavigationBar = 1 << 4,
            //點(diǎn)擊中心視圖控制器視圖時可以關(guān)閉側(cè)邊欄
            MMCloseDrawerGestureModeTapCenterView= 1 << 5,
            //在側(cè)邊欄視圖上拖動時可以關(guān)閉側(cè)邊欄
            MMCloseDrawerGestureModePanningDrawerView= 1 << 6,
            //自定義關(guān)閉手勢担忧,需要和自定義手勢的方法結(jié)合使用  
            MMCloseDrawerGestureModeCustom= 1 << 7,
            //所有模式兼容
            MMCloseDrawerGestureModeAll = MMCloseDrawerGestureModePanningNavigationBar|MMCloseDrawerGestureModePanningCenterView|MMCloseDrawerGestureModeBezelPanningCenterView|MMCloseDrawerGestureModeTapNavigationBar |MMCloseDrawerGestureModeTapCenterView|MMCloseDrawerGestureModePanningDrawerView|MMCloseDrawerGestureModeCustom,
};*/
@property (nonatomic, assign) MMCloseDrawerGestureMode closeDrawerGestureModeMask;
//設(shè)置側(cè)邊欄顯示時的中心視圖控制器的用戶交互規(guī)則 MMDrawerOpenCenterInteractionMode枚舉意義如下
/*typedef NS_ENUM(NSInteger, MMDrawerOpenCenterInteractionMode) {
            //中心視圖控制器不能進(jìn)行用戶交互 默認(rèn)為此枚舉
            MMDrawerOpenCenterInteractionModeNone,
            //中心視圖控制器完全可以進(jìn)行用戶交互
            MMDrawerOpenCenterInteractionModeFull,
           //中心視圖控制器只有導(dǎo)航可以進(jìn)行用戶交互 
           MMDrawerOpenCenterInteractionModeNavigationBarOnly,
};*/
@property (nonatomic, assign) MMDrawerOpenCenterInteractionMode centerHiddenInteractionMode;
//設(shè)置是否顯示陰影效果
@property (nonatomic, assign) BOOL showsShadow;
//設(shè)置是否顯示狀態(tài)欄的自定義視圖 只有在iOS7之后可用
@property (nonatomic, assign) BOOL showsStatusBarBackgroundView;
//設(shè)置狀態(tài)欄視圖顏色 只有在iOS7之后可用
@property (nonatomic, strong) UIColor * statusBarViewBackgroundColor; 
//相關(guān)方法解析如下:
//切換側(cè)邊欄的狀態(tài)芹缔,drawerSide參數(shù)為要切換的側(cè)邊欄,animated設(shè)置是否有動畫效果瓶盛,completion會在切換完成后執(zhí)行
//注意:如果在切換一個關(guān)著的側(cè)邊欄時最欠,如果另一個側(cè)邊欄正在開啟狀態(tài),則此方法不會有任何效果
-(void)toggleDrawerSide:(MMDrawerSide)drawerSide animated:(BOOL)animated completion:(void(^)(BOOL finished))completion;
//關(guān)閉側(cè)邊欄
-(void)closeDrawerAnimated:(BOOL)animated completion:(void(^)(BOOL finished))completion;
//開啟側(cè)邊欄-(void)openDrawerSide:(MMDrawerSide)drawerSide animated:(BOOL)animated completion:(void(^)(BOOL finished))completion;
//更換中心視圖控制器
-(void)setCenterViewController:(UIViewController *)centerViewController withCloseAnimation:(BOOL)closeAnimated completion:(void(^)(BOOL finished))completion;-(void)setCenterViewController:(UIViewController *)newCenterViewController withFullCloseAnimation:(BOOL)fullCloseAnimated completion:(void(^)(BOOL finished))completion;
//設(shè)置左側(cè)邊欄最大寬度
-(void)setMaximumLeftDrawerWidth:(CGFloat)width animated:(BOOL)animated completion:(void(^)(BOOL finished))completion;
//設(shè)置右側(cè)邊欄最大寬度
-(void)setMaximumRightDrawerWidth:(CGFloat)width animated:(BOOL)animated completion:(void(^)(BOOL finished))completion;
//進(jìn)行側(cè)邊欄的預(yù)覽操作 默認(rèn)預(yù)覽距離為40個單位
-(void)bouncePreviewForDrawerSide:(MMDrawerSide)drawerSide completion:(void(^)(BOOL finished))completion;
//進(jìn)行側(cè)邊欄的預(yù)覽操作 可以設(shè)置預(yù)覽距離
-(void)bouncePreviewForDrawerSide:(MMDrawerSide)drawerSide distance:(CGFloat)distance completion:(void(^)(BOOL finished))completion;
//這個方法用于進(jìn)行視圖側(cè)邊欄視圖出現(xiàn)動畫的自定義
-(void)setDrawerVisualStateBlock:(void(^)(MMDrawerController * drawerController, MMDrawerSide drawerSide, CGFloat percentVisible))drawerVisualStateBlock;
//這個方法用于設(shè)置當(dāng)一個手勢觸發(fā)完成后的回調(diào)
-(void)setGestureCompletionBlock:(void(^)(MMDrawerController * drawerController, UIGestureRecognizer * gesture))gestureCompletionBlock;
//這個方法用于定義自定義的手勢操作 要將開啟側(cè)邊欄與關(guān)閉側(cè)邊欄的模式設(shè)置為MMOpenDrawerGestureModeCustom和MMCloseDrawerGestureModeCustom才有效
-(void)setGestureShouldRecognizeTouchBlock:(BOOL(^)(MMDrawerController * drawerController, UIGestureRecognizer * gesture, UITouch * touch))gestureShouldRecognizeTouchBlock;
//對于自定義過渡動畫的方法:
-(void)setDrawerVisualStateBlock:(void(^)(MMDrawerController * drawerController, MMDrawerSide drawerSide, CGFloat percentVisible))drawerVisualStateBlock;
//回調(diào)block中會傳遞進(jìn)來側(cè)邊欄顯示完成的百分比惩猫,并且在側(cè)邊欄出現(xiàn)過程中芝硬,這個回調(diào)block會被不停刷新調(diào)用,開發(fā)者可以直接在其中對要過渡的屬性進(jìn)行設(shè)置轧房,例如透明度的漸變動畫吵取,示例如下:
//進(jìn)行自定義動畫
[rootController setDrawerVisualStateBlock:^(MMDrawerController *drawerController, MMDrawerSide drawerSide, CGFloat percentVisible) {
    UIViewController * sideDrawerViewController;
    if(drawerSide == MMDrawerSideLeft) {
            sideDrawerViewController = drawerController.leftDrawerViewController;
    }else if (drawerSide == MMDrawerSideRight) {
            sideDrawerViewController = drawerController.rightDrawerViewController;
    }
    [sideDrawerViewController.view setAlpha:percentVisible];
}];

三、關(guān)于MMDrawerController的子類 開發(fā)者如果有特殊的需求锯厢,也可以通過繼承MMDrawerController來實(shí)現(xiàn)自己的側(cè)邊欄控制器類皮官,MMDrawerController框架中提供了一個擴(kuò)展,在編寫MMDrawerController時实辑,開發(fā)者可以導(dǎo)入MMDrawerController+Subclass.h文件捺氢,這個文件中提供了許多控制器的監(jiān)聽方法供開發(fā)者重寫,解析如下:

//出現(xiàn)單擊手勢會回調(diào)的方法 如果要重寫 必須調(diào)用父類的此方法
-(void)tapGestureCallback:(UITapGestureRecognizer *)tapGesture __attribute((objc_requires_super));
//出現(xiàn)滑動手勢會回調(diào)的方法 如果要重寫 必須調(diào)用父類的此方法
-(void)panGestureCallback:(UIPanGestureRecognizer *)panGesture __attribute((objc_requires_super));
//決定是否響應(yīng)某個手勢
-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch __attribute((objc_requires_super));
//準(zhǔn)備展示側(cè)邊欄時調(diào)用的方法
-(void)prepareToPresentDrawer:(MMDrawerSide)drawer animated:(BOOL)animated __attribute((objc_requires_super));
//關(guān)閉側(cè)邊欄時調(diào)用的方法-(void)closeDrawerAnimated:(BOOL)animated velocity:(CGFloat)velocity animationOptions:(UIViewAnimationOptions)options completion:(void (^)(BOOL))completion __attribute((objc_requires_super));
//打開側(cè)邊欄時調(diào)用的方法
-(void)openDrawerSide:(MMDrawerSide)drawerSide animated:(BOOL)animated velocity:(CGFloat)velocity animationOptions:(UIViewAnimationOptions)options completion:(void (^)(BOOL))completion __attribute((objc_requires_super));
//設(shè)備旋轉(zhuǎn)方向時調(diào)用的方法
-(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration __attribute((objc_requires_super));
-(void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration __attribute((objc_requires_super));

四剪撬、一些輔助類 MMDrawerController框架中還提供了一個MMDrawerBarButtonItem的輔助類摄乒,這個類可以創(chuàng)建三道杠的菜單按鈕。其中方法如下:

//初始化方法
-(id)initWithTarget:(id)target action:(SEL)action;
//獲取某個狀態(tài)下的按鈕顏色
-(UIColor *)menuButtonColorForState:(UIControlState)state __attribute__((deprecated("Use tintColor instead")));
//設(shè)置某個狀態(tài)的按鈕顏色
-(void)setMenuButtonColor:(UIColor *)color forState:(UIControlState)state __attribute__((deprecated("Use tintColor instead")));
// MMDrawerBarButtonItem繼承自UIBarButtonItem残黑,可以直接在導(dǎo)航欄上使用馍佑。

前面有提到,側(cè)邊欄的展現(xiàn)動畫開發(fā)者可以進(jìn)行自定義梨水,為了使開發(fā)者在使用MMDrawerController時更加方便拭荤,MMDrawerController框架中還提供了一個動畫輔助類MMDrawerVisualState,這個類中封裝好了許多動畫效果疫诽,開發(fā)者可以直接使用舅世,示例如下:

//使用提供的動畫模板
[rootController setDrawerVisualStateBlock:[MMDrawerVisualState slideAndScaleVisualStateBlock]]; 
//MMDrawerVisualState中所提供的動畫模板列舉如下:
//從后向前漸現(xiàn)
+(MMDrawerControllerDrawerVisualStateBlock)slideAndScaleVisualStateBlock;
//滑動漸現(xiàn)
+(MMDrawerControllerDrawerVisualStateBlock)slideVisualStateBlock;
//立方動畫
+(MMDrawerControllerDrawerVisualStateBlock)swingingDoorVisualStateBlock;
//視差動畫
+(MMDrawerControllerDrawerVisualStateBlock)parallaxVisualStateBlockWithParallaxFactor:(CGFloat)parallaxFactor;

 五旦委、MMDrawerController無法完成的需求 為了確保MMDrawerController庫的輕量級,其作者在設(shè)計(jì)時也做了功能上的取舍權(quán)衡雏亚,MMDrawerController無法完成以下需求:
    1.上邊欄與下邊欄缨硝。
    2.同時展示左邊欄與又邊欄。
    3.無法設(shè)置顯示一個最小的抽屜寬度罢低。
    4.不能支持UITabBarController容器查辩。
    5.不能在中心視圖控制器之上呈現(xiàn)側(cè)邊欄視圖。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末网持,一起剝皮案震驚了整個濱河市宜岛,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌翎碑,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件之斯,死亡現(xiàn)場離奇詭異日杈,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)佑刷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進(jìn)店門莉擒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人瘫絮,你說我怎么就攤上這事涨冀。” “怎么了麦萤?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵鹿鳖,是天一觀的道長。 經(jīng)常有香客問我壮莹,道長翅帜,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任命满,我火速辦了婚禮涝滴,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘胶台。我一直安慰自己歼疮,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布诈唬。 她就那樣靜靜地躺著韩脏,像睡著了一般。 火紅的嫁衣襯著肌膚如雪铸磅。 梳的紋絲不亂的頭發(fā)上骤素,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天匙睹,我揣著相機(jī)與錄音,去河邊找鬼济竹。 笑死痕檬,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的送浊。 我是一名探鬼主播梦谜,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼袭景!你這毒婦竟也來了唁桩?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤耸棒,失蹤者是張志新(化名)和其女友劉穎荒澡,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體与殃,經(jīng)...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡单山,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了幅疼。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片米奸。...
    茶點(diǎn)故事閱讀 38,094評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖爽篷,靈堂內(nèi)的尸體忽然破棺而出悴晰,到底是詐尸還是另有隱情,我是刑警寧澤逐工,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布铡溪,位于F島的核電站,受9級特大地震影響泪喊,放射性物質(zhì)發(fā)生泄漏佃却。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一窘俺、第九天 我趴在偏房一處隱蔽的房頂上張望饲帅。 院中可真熱鬧,春花似錦瘤泪、人聲如沸灶泵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽赦邻。三九已至,卻和暖如春实檀,著一層夾襖步出監(jiān)牢的瞬間惶洲,已是汗流浹背按声。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留恬吕,地道東北人签则。 一個月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像铐料,于是被迫代替她去往敵國和親渐裂。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評論 2 345

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

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫钠惩、插件柒凉、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,029評論 4 62
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,514評論 25 707
  • 總結(jié)我這二十幾年來有限的人生經(jīng)歷,人呢在遭遇厄運(yùn)的時候若是不冷靜篓跛,會更加的在這個泥沼當(dāng)中越陷越深膝捞。當(dāng)情緒波折很大,...
    愛笑的姑娘小西閱讀 1,131評論 0 0
  • 2016年度之《星辰大海,詩和遠(yuǎn)方》央渣,擁抱工作计盒,擁抱世界渴频。每一年對我來說都是新的詩篇芽丹,步履匆匆,年年不忘卜朗。 不知道...
    大藝術(shù)家kiwi閱讀 2,468評論 1 5
  • 九月三十號早上剛上班就收到朋友的信息說他搶到了去西寧的火車票拔第,當(dāng)時心里一震,去青海是我2017年的愿望之一但一直沒...
    nice_五月閱讀 404評論 1 0