前言

  • iOS 常见的几种架构:

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

1、标签式

  • 优点:

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

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

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

  • 缺点:

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

2、列表式

  • 优点:

    • 1、层次展示清晰

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

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

  • 缺点:

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

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

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

3、抽屉式

  • 优点:

    • 1、兼容多种模式

    • 2、扩展性好

  • 缺点:

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

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

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

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

4、瀑布式

  • 优点:

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

  • 缺点:

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

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

5、跳板式

  • 优点:

    • 1、清晰展现各入口

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

  • 缺点:

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

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

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

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

6、陈列馆式

  • 优点:

    • 1、直观展现各项内容

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

  • 缺点:

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

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

    • 3、设计效果容易呆板

7、旋转木马式

  • 优点:

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

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

  • 缺点:

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

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

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

8、点聚式

  • 优点:

    • 1、灵活

    • 2、展示方式有趣

    • 3、使界面更开阔

  • 缺点:

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

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

iOS - Frame 项目架构的更多相关文章

  1. iOS项目架构文档

    设计的项目架构主要引用MVVM+MVC架构,并以功能模块分级.以下为目录结构. 初级目录: 我们只需要关注SGZH文件夹下的目录,其他为Xcode管理的目录.可以看到此目录为项目初级目录,我们开发过程 ...

  2. 李洪强iOS开发之 - 项目架构

    李洪强iOS开发之 - 项目架构 01 - 在Appdelegate中设置跟控制器 //导入头文件

  3. iOS原生项目中集成React Native

    1.本文的前提条件是,电脑上已经安装了CocoaPods,React Native相关环境. 2.使用Xcode新建一个工程.EmbedRNMeituan [图1] 3.使用CocoaPods安装Re ...

  4. 直接拿来用!最火的iOS开源项目

    1. AFNetworking 在众多iOS开源项目中,AFNetworking可以称得上是最受开发者欢迎的库项目.AFNetworking是一个轻量级的iOS.Mac OS X网络通信类库,现在是G ...

  5. (转)直接拿来用!最火的iOS开源项目(二)

    “每一次的改变总意味着新的开始.”这句话用在iOS上可谓是再合适不过的了.GitHub上的iOS开源项目数不胜数,iOS每一次的改变,总会引发iOS开源项目的演变,从iOS 1.x到如今的iOS 7, ...

  6. 无限互联IOS电影项目视频笔记

    下面是该iOS项目视频教程的内容大纲: 观看指南 (1)项目为第一阶段内容 (2)需要熟练掌握OC语言 (3)UI部分需要学习到第十节课 (4)项目适合刚入门的iOS开发者 1.第一天 (1)iOS ...

  7. GitHub上最火的40个iOS开源项目

    1. AFNetworking 在众多iOS开源项目中,AFNetworking可以称得上是最受开发者欢迎的库项目.AFNetworking是一个轻量级的iOS. Mac OS X网络通信类库,现在是 ...

  8. GitHub上有很多不错的iOS开源项目

    GitHub上有很多不错的iOS开源项目,个人认为不错的,有这么几个:1. ReactiveCocoa:ReactiveCocoa/ReactiveCocoa · GitHub:GitHub自家的函数 ...

  9. GitHub上非常受开发者欢迎的iOS开源项目(二)

    "每一次的改变总意味着新的开始."这句话用在iOS上可谓是再合适不过的了.GitHub上的iOS开源项目数不胜数,iOS每一次的改变,总会引发iOS开源项目的演变,从iOS 1.x ...

随机推荐

  1. 阿里云专有网络与弹性公网IP

    阿里云服务器经典网络和专有网络究竟有什么区别? 在用户提交订单购买阿里云ECS云服务器时,会面临怎样选择网络类型的烦恼,阿里云服务器定制购买时,网络类型里的经典网络和专有网络(VPC)是什么含义,该怎 ...

  2. PHP数据运算优先级总结记忆

    运算符优先级

  3. html基本的内容

    1.表现各标签的特征 <img>中的src(source)即为属性 属性都是以"属性名 = 值"的形式出现 属性的值建议用引号括起来 属性建议均以键值对的形式括起来 一 ...

  4. 使用HttpWebrequest对网站进行模拟操作(附登陆百度demo)

    // a[href=#viewSource]"); //查看源代码标签 viewSourceArr.attr("title", "查看源代码"); v ...

  5. Raspberry PI B+ debian + wifi 网络设置

    # file /etc/network/interfaces auto lo iface lo inet loopback #auto eth0 #allow-hotplug eth0 #iface ...

  6. net-snmp源码VS2013编译添加加密支持(OpenSSL)(在VS里配置编译OpenSSL)

    net-snmp源码VS2013编译添加加密支持(OpenSSL) snmp v3 协议使用了基于用户的安全模型,具有认证和加密两个模块. 认证使用的算法是一般的消息摘要算法,例如MD5/SHA等.这 ...

  7. php导出数据到excel,防止身份证等数字字符格式变成科学计数的方法

    而关于php的也有,但是大多都是用phpExcel导出的方法或者spreadsheet等类或者控件之类的导出方法,而我所在维护的系统却用很简单的方法,如下,网上很少有讲如何设置要导出数据的EXcel格 ...

  8. 《Linux内核设计与实现》CHAPTER18阅读梳理

    <Linux内核设计与实现>CHAPTER18阅读梳理 [学习时间:2hours] [学习内容:bug的来源分析:bug调试途径] 一.bug来源 1.内核中的bug 内核中的bug表现得 ...

  9. Java反射深入浅出(一)

    在JVM中对一个类实例的创建,有两种方式,一种是编译时,一种是运行时.两种方式在开发过程中都是十分重要的.在Java中无时无刻无处不在的Java对象,实例化的过程也就变得尤为引人瞩目.我们经常用new ...

  10. Fiddler---前端利器

    摘要:Fiddler是一个不错的工具,可以用来调试HTTP协议.工具很强大,本篇根据现有使用总结了下,以后有更多使用再做补充. 在做HTTPS协议对接的时候,拿不到数据,不得不找个工具试下,确定是接收 ...