Drawer 抽屉式架构

前言

  • 优点:

    • 1、兼容多种模式
    • 2、扩展性好

  • 缺点:

    • 1、隐藏框架中其他入口
    • 2、对入口交互的功能可见性(affordance)要求高

1、抽屉式架构简单实现

  • ViewController.m

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    #import "ViewController.h"
    #import "QCMainViewController.h"
    #import "QCDrawerViewController.h"

    /// 设定抽屉视图的宽度
    #define DRAWER_VC_WIDTH ((self.view.bounds.size.width * 3) / 4)

    @interface ViewController ()

    @property (nonatomic, strong) QCMainViewController *mainVC;
    @property (nonatomic, strong) UINavigationController *mainNVC;

    @property (nonatomic, strong) QCDrawerViewController *drawerVC;

    @end

    @implementation ViewController

    - (void)viewDidLoad {
    [super viewDidLoad];

    /// 添加主视图
    self.mainVC = [[QCMainViewController alloc] init];
    self.mainNVC = [[UINavigationController alloc] initWithRootViewController:self.mainVC];
    [self addChildViewController:self.mainNVC];
    [self.view addSubview:self.mainNVC.view];

    /// 添加抽屉视图
    self.drawerVC = [[QCDrawerViewController alloc] init];
    self.drawerVC.view.frame = CGRectMake(-DRAWER_VC_WIDTH, 0, DRAWER_VC_WIDTH, self.view.bounds.size.height);
    [self addChildViewController:self.drawerVC];
    [self.view addSubview:self.drawerVC.view];

    /// 抽屉视图显示/隐藏回调
    __weak typeof(self) weakSelf = self;
    self.mainVC.myBlock = ^(BOOL isPush){

    CGRect mainNVCFrame = weakSelf.self.mainNVC.view.bounds;
    CGRect drawerVCFrame = weakSelf.self.drawerVC.view.bounds;

    mainNVCFrame.origin.x = isPush ? DRAWER_VC_WIDTH : 0;
    drawerVCFrame.origin.x = isPush ? 0 : -DRAWER_VC_WIDTH;

    [UIView animateWithDuration:0.5 animations:^{
    weakSelf.mainNVC.view.frame = mainNVCFrame;
    weakSelf.drawerVC.view.frame = drawerVCFrame;
    }];
    };
    }

    @end
  • QCMainViewController.h

    1
    2
    3
    4
    5
    6
    7
    #import <UIKit/UIKit.h>

    @interface QCMainViewController : UIViewController

    @property (nonatomic, copy) void (^myBlock)(BOOL);

    @end
  • QCMainViewController.m

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    #import "QCMainViewController.h"

    @interface QCMainViewController ()

    @property (nonatomic, assign, getter = isPush) BOOL push;

    @end

    @implementation QCMainViewController

    - (void)viewDidLoad {
    [super viewDidLoad];

    self.view.backgroundColor = [UIColor yellowColor];

    self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"抽屉" style:UIBarButtonItemStylePlain target:self action:@selector(pushDrawer)];

    /// 功能测试
    for (NSUInteger i = 0; i < 5; i++) {
    UIButton *btn = [[UIButton alloc] init];
    [self.view addSubview:btn];
    btn.frame = CGRectMake(20, 200 + i * 60, 100, 50);
    btn.tag = i +1;
    [btn setTitle:[NSString stringWithFormat:@"按钮 %li", i + 1] forState:UIControlStateNormal];
    [btn setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
    [btn addTarget:self action:@selector(btnClick:) forControlEvents:UIControlEventTouchUpInside];
    }
    }

    /// 功能测试
    - (void)btnClick:(UIButton *)btn {
    NSLog(@"按钮 %li", btn.tag);
    }

    /// 抽屉视图显示/隐藏
    - (void)pushDrawer {

    self.push = !self.isPush;

    if (self.myBlock != nil) {
    self.myBlock(self.isPush);
    }
    }

    /// 触摸手势抽屉视图显示/隐藏
    - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {

    if (self.isPush) {
    [self pushDrawer];
    }
    }

    @end
  • QCDrawerViewController.m

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    #import "QCDrawerViewController.h"

    @interface QCDrawerViewController ()

    @end

    @implementation QCDrawerViewController

    - (void)viewDidLoad {
    [super viewDidLoad];

    self.view.backgroundColor = [UIColor blueColor];

    /// 功能测试
    for (NSUInteger i = 0; i < 5; i++) {
    UIButton *btn = [[UIButton alloc] init];
    [self.view addSubview:btn];
    btn.frame = CGRectMake(20, 200 + i * 60, 100, 50);
    btn.tag = i +1;
    [btn setTitle:[NSString stringWithFormat:@"功能 %li", i + 1] forState:UIControlStateNormal];
    [btn addTarget:self action:@selector(btnClick:) forControlEvents:UIControlEventTouchUpInside];
    }
    }

    /// 功能测试
    - (void)btnClick:(UIButton *)btn {
    NSLog(@"功能 %li", btn.tag);
    }

    @end
  • 效果

2、抽屉式架构第三方框架实现

文章目录
  1. 1. 前言
  2. 2. 1、抽屉式架构简单实现
  3. 3. 2、抽屉式架构第三方框架实现
隐藏目录