zoukankan      html  css  js  c++  java
  • iOS

    前言

    • iOS 常见的几种架构:

      • 标签式 Tab Menu
      • 列表式 List Menu
      • 抽屉式 Drawer
      • 瀑布式 Waterfall
      • 跳板式 Springborad
      • 陈列馆式 Gallery
      • 旋转木马式 Carousel
      • 点聚式 Plus

    1、标签式

    • 优点:

      • 1、清楚当前所在的入口位置

      • 2、轻松在各入口间频繁跳转且不会迷失方向

      • 3、直接展现最重要入口的内容信息

        Frame1

    • 缺点:

      • 功能入口过多时,该模式显得笨重不实用

        Frame2

    2、列表式

    • 优点:

      • 1、层次展示清晰

      • 2、可展示内容较长的标题

      • 3、可展示标题的次级内容

        Frame5

    • 缺点:

      • 1、同级内容过多时,用户浏览容易产生疲劳

      • 2、排版灵活性不是很高

      • 3、只能通过排列顺序、颜色来区分各入口重要程度

        Frame6

    3、抽屉式

    • 优点:

      • 1、兼容多种模式

      • 2、扩展性好

        Frame9

    • 缺点:

      • 1、隐藏框架中其他入口

      • 2、对入口交互的功能可见性(affordance)要求高

        Frame10

        Frame11

    3.1 抽屉式架构简单实现

    • ViewController.m

      	#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

      	#import <UIKit/UIKit.h>
      	
      	@interface QCMainViewController : UIViewController
      	
      	@property (nonatomic, copy) void (^myBlock)(BOOL);
      	
      	@end
      
    • QCMainViewController.m

      	#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

      	#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
      
    • 效果

      drawer1 drawer2

    3.2 抽屉式架构第三方框架实现

    4、瀑布式

    • 优点:

      • 1、浏览时产生流畅体验

        Frame17

    • 缺点:

      • 1、缺乏对整体内容的体积感,容易发生空间位置迷失

      • 2、浏览一段时间后,容易产生疲劳感

        Frame18

    5、跳板式

    • 优点:

      • 1、清晰展现各入口

      • 2、容易记住各入口位置,方便快速找到

        Frame3

    • 缺点:

      • 1、无法在多入口间灵活跳转,不适合多任务操作

      • 2、容易形成更深的路径

      • 3、不能直接展现入口内容

      • 4、不能显示太多入口次级内容

        Frame4

    6、陈列馆式

    • 优点:

      • 1、直观展现各项内容

      • 2、方便浏览经常更新的内容

        Frame15

    • 缺点:

      • 1、不适合展现顶层入口框架

      • 2、容易形成界面内容过多,显得杂乱

      • 3、设计效果容易呆板

        Frame16

    7、旋转木马式

    • 优点:

      • 1、单页面内容整体性强

      • 2、线性的浏览方式有顺畅感、方向感

        Frame7

    • 缺点:

      • 1、不适合展示过多页面

      • 2、不能跳跃性地查看间隔的页面,只能按顺序查看相邻的页面

      • 3、由于各页面内容结构相似,容易忽略后面的内容

        Frame8

    8、点聚式

    • 优点:

      • 1、灵活

      • 2、展示方式有趣

      • 3、使界面更开阔

        Frame12

    • 缺点:

      • 1、隐藏框架中其他入口

      • 2、对入口交互的功能可见性(affordance)要求高

        Frame13

        Frame14

  • 相关阅读:
    PHP+VUE实现前端和后端数据互通(宝塔面板)
    PHP上传图片
    GIT常用命令
    基于Postman中的报错
    VUE项目Eslint报错
    git配置:本地仓库提交到远程仓库
    mybatis基础
    Json验证数据
    Json 三种格式数据解析
    Ajax 实现数据异步传输
  • 原文地址:https://www.cnblogs.com/QianChia/p/6212157.html
Copyright © 2011-2022 走看看