VTMagic

有很多开发者曾尝试模仿写出类似网易、腾讯等应用的菜单分页组件,但遍观其设计,大多都比较粗糙,不利于后续维护和扩展。琢磨良久,最终决定开源这个耗时近两年打磨而成的框架,以便大家可以快速实现类似需求,而不用把大量的精力浪费在重复造轮子的过程中,VTMagic目前在多个项目中稳定运行一年多。

特性概要

  1. 每个页面都是一个完整的控制器,友好支持个性化自定义;

  2. 页面切换时能准确触发相应的生命周期方法(viewWillAppear:等),便于管理各自页面的数据加载和其它逻辑处理;

  3. 导航栏支持多种布局样式,包括自适应文本宽度、自动平分、居中布局以及自定义宽度等;

  4. 可以在任意子控制器中,通过self.magicController获取最近的上层主控制器,方便跨层级处理逻辑;

  5. 支持内嵌webview,若滑动手势无法响应,可以通过handlePanGesture:解决;

  6. 支持页面重用和横竖屏切换;

  7. 更多特性请参见VTMagicView.h文件。

使用

VTMagic支持CocoaPods,只需在Podfile文件中添加如下代码即可:

pod "VTMagic"

集成

关于VTMagic的集成方法主要有以下两种:

1. 直接实例化VTMagicController对象,然后添加到当前控制器中。

- (void)viewDidLoad

{

[super viewDidLoad];

[self addChildViewController:self.magicController];

[self.view addSubview:_magicController.view];

[_magicController didMoveToParentViewController:self];

[_magicController.magicView reloadData];

}

- (VTMagicController *)magicController

{

if (!_magicController) {

_magicController = [[VTMagicController alloc] init];

_magicController.magicView.navigationColor = [UIColor whiteColor];

_magicController.magicView.sliderColor = [UIColor redColor];

_magicController.magicView.layoutStyle = VTLayoutStyleDivide;

_magicController.magicView.switchStyle = VTSwitchStyleDefault;

_magicController.magicView.navigationHeight = 40.f;

_magicController.magicView.dataSource = self;

_magicController.magicView.delegate = self;

}

return _magicController;

}

2. 继承VTMagicController,然后在viewDidLoad中完成相应配置。

#import "VTMagicController.h"

@interface ViewController : VTMagicController

@end

@implementation ViewController

- (void)viewDidLoad

{

[super viewDidLoad];

self.magicView.navigationColor = [UIColor whiteColor];

self.magicView.sliderColor = [UIColor redColor];

self.magicView.layoutStyle = VTLayoutStyleDefault;

self.magicView.switchStyle = VTSwitchStyleDefault;

self.magicView.navigationHeight = 40.f;

self.magicView.dataSource = self;

self.magicView.delegate = self;

[self.magicView reloadData];

}

VTMagicViewDataSource协议

不管是通过以上哪种方法集成的,都需要实现数据源协议< VTMagicViewDataSource >,主要有以下三个方法:

- (NSArray<NSString *> *)menuTitlesForMagicView:(VTMagicView *)magicView

{

return _menuList;

}

- (UIButton *)magicView:(VTMagicView *)magicView menuItemAtIndex:(NSUInteger)itemIndex

{

static NSString *itemIdentifier = @"itemIdentifier";

UIButton *menuItem = [magicView dequeueReusableItemWithIdentifier:itemIdentifier];

if (!menuItem) {

menuItem = [UIButton buttonWithType:UIButtonTypeCustom];

[menuItem setTitleColor:RGBCOLOR(50, 50, 50) forState:UIControlStateNormal];

[menuItem setTitleColor:RGBCOLOR(169, 37, 37) forState:UIControlStateSelected];

menuItem.titleLabel.font = [UIFont fontWithName:@"Helvetica" size:16.f];

}

return menuItem;

}

- (UIViewController *)magicView:(VTMagicView *)magicView viewControllerAtPage:(NSUInteger)pageIndex

{

if (0 == pageIndex) {

static NSString *recomId = @"recom.identifier";

VTRecomViewController *recomViewController = [magicView dequeueReusablePageWithIdentifier:recomId];

if (!recomViewController) {

recomViewController = [[VTRecomViewController alloc] init];

}

return recomViewController;

}

static NSString *gridId = @"grid.identifier";

VTGridViewController *gridViewController = [magicView dequeueReusablePageWithIdentifier:gridId];

if (!gridViewController) {

gridViewController = [[VTGridViewController alloc] init];

}

return gridViewController;

}

集成效果

效果动态图太大此处无法展示,可点击原文进行查看

 

重要协议

除了数据源协议< VTMagicViewDataSource >外 ,VTMagic中的重要协议还有< VTMagicViewDelegate >和< VTMagicReuseProtocol >。前者用于在主控制器中处理页面切换事件;后者用于子控制器被重用时,清除旧数据等逻辑处理。

VTMagicViewDelegate协议

- (void)magicView:(VTMagicView *)magicView viewDidAppeare:(UIViewController *)viewController atPage:(NSUInteger)pageIndex

{

NSLog(@"pageIndex:%ld viewDidAppeare:%@",pageIndex, viewController.view);

}

- (void)magicView:(VTMagicView *)magicView viewDidDisappeare:(UIViewController *)viewController atPage:(NSUInteger)pageIndex

{

NSLog(@"pageIndex:%ld viewDidDisappeare:%@",pageIndex, viewController.view);

}

- (void)magicView:(VTMagicView *)magicView didSelectItemAtIndex:(NSUInteger)itemIndex

{

NSLog(@"didSelectItemAtIndex:%ld", (long)itemIndex);

}

VTMagicReuseProtocol

 

- (void)vtm_prepareForReuse

{

NSLog(@"clear old data if needed:%@", self);

}

其它

  • 你可以在任意子控制器中,通过self.magicController获取最近的上层主控制器,magicController遵循协议< VTMagicProtocol >,以便完成一些必要的跨层级的逻辑处理,前提是你需要import <VTMagic/VTMagic.h>文件。

NSInteger currentPage = self.magicController.currentPage;

UIViewController *viewController = self.magicController.currentViewController;

切换到指定页面,页面切换有两种方式:

[self.magicView switchToPage:3 animated:YES];

或者

[self.magicController switchToPage:3 animated:YES];

  • 获取指定页面控制器,同样有两种方式:

UIViewController *viewController = [self.magicView viewControllerAtPage:3]

或者

UIViewController *viewController = [self.magicController viewControllerAtPage:3];

结束语

最后,按照惯例,如果你喜欢这个轮子,请留下一颗star,也欢迎大家扩散,这是对作者最大的鼓励和支持,拜谢!!!

GitHub地址:https://github.com/tianzhuo112/VTMagic

VTMagic 的使用介绍的更多相关文章

  1. 开源框架VTMagic的使用介绍

    VTMagic 有很多开发者曾尝试模仿写出类似网易.腾讯等应用的菜单分页组件,但遍观其设计,大多都比较粗糙,不利于后续维护和扩展.琢磨良久,最终决定开源这个耗时近两年打磨而成的框架,以便大家可以快速实 ...

  2. CSS3 background-image背景图片相关介绍

    这里将会介绍如何通过background-image设置背景图片,以及背景图片的平铺.拉伸.偏移.设置大小等操作. 1. 背景图片样式分类 CSS中设置元素背景图片及其背景图片样式的属性主要以下几个: ...

  3. MySQL高级知识- MySQL的架构介绍

    [TOC] 1.MySQL 简介 概述 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle公司. MySQL是一种关联数据库管理系统,将数据保存在不同的表中,而 ...

  4. Windows Server 2012 NIC Teaming介绍及注意事项

    Windows Server 2012 NIC Teaming介绍及注意事项 转载自:http://www.it165.net/os/html/201303/4799.html Windows Ser ...

  5. Linux下服务器端开发流程及相关工具介绍(C++)

    去年刚毕业来公司后,做为新人,发现很多东西都没有文档,各种工具和地址都是口口相传的,而且很多时候都是不知道有哪些工具可以使用,所以当时就想把自己接触到的这些东西记录下来,为后来者提供参考,相当于一个路 ...

  6. JavaScript var关键字、变量的状态、异常处理、命名规范等介绍

    本篇主要介绍var关键字.变量的undefined和null状态.异常处理.命名规范. 目录 1. var 关键字:介绍var关键字的使用. 2. 变量的状态:介绍变量的未定义.已定义未赋值.已定义已 ...

  7. HTML DOM 介绍

    本篇主要介绍DOM内容.DOM 节点.节点属性以及获取HTML元素的方法. 目录 1. 介绍 DOM:介绍DOM,以及对DOM分类和功能的说明. 2. DOM 节点:介绍DOM节点分类和节点层次. 3 ...

  8. HTML 事件(一) 事件的介绍

    本篇主要介绍HTML中的事件知识:事件相关术语.DOM事件规范.事件对象. 其他事件文章 1. HTML 事件(一) 事件的介绍 2. HTML 事件(二) 事件的注册与注销 3. HTML 事件(三 ...

  9. HTML5 介绍

    本篇主要介绍HTML5规范的内容和页面上的架构变动. 目录 1. HTML5介绍 1.1 介绍 1.2 内容 1.3 浏览器支持情况 2. 创建HTML5页面 2.1 <!DOCTYPE> ...

随机推荐

  1. 【C语言】printf函数详解

    C语言printf函数详解 一.相关基础知识 请求printf()打印变量的指令取决于变量的类型,例如打印整数用%d符号,打印字符用%c符号,这些符号称为转换说明(conversion specifi ...

  2. 解决File.delete()删除不掉文件

    首先注意两点: 此文件被使用的时候无法删除(比如网络输出没关闭流) 判断此文件是否存在再做删除(exists) 删除文件夹之前先删除文件夹下的所有文件(递归解决) 判断是否删除成功会有返回值,文件名错 ...

  3. 第1章 开发环境安装和配置(二)安装JDK、SDK、NDK

    原文 第1章 开发环境安装和配置(二)安装JDK.SDK.NDK 无论是用C#和VS2015开发Androd App还是用Java和Eclipse开发Androd App,都需要先安装JDK和Andr ...

  4. 在 ActionBar 添加刷新按钮

    在以前版本的 Gmail 应用中,ActionBar 上有个刷新菜单,点击一下刷新菜单变成一个转圈的刷新标示动画图片. 之前实现该功能的时候都是使用一个类库 RefreshActionItem来实现的 ...

  5. Lua function 函数

    Lua支持面向对象,操作符为冒号‘:’.o:foo(x) <==> o.foo(o, x). Lua程序可以调用C语言或者Lua实现的函数.Lua基础库中的所有函数都是用C实现的.但这些细 ...

  6. python手记(30)

    #!/usr/bin/env python #-*- coding: utf-8 -*- import cv2 import numpy as np fn="test3.png" ...

  7. 利用merge优化

    create table a1(TP_END_DATE NUMBER,WK_END_DATE NUMBER, MTH_START_DATE NUMBER, MTH_END_DATE NUMBER, T ...

  8. Node.js权威指南 (5) - 使用Buffer类处理二进制数据

    5.1 创建Buffer对象 / 705.2 字符串的长度与缓存区的长度 / 725.3 Buffer对象与字符串对象之间的相互转换 / 74 5.3.1 Buffer对象的toString方法 / ...

  9. android逐行读取文件内容以及保存为文件

    用于长时间使用的apk,并且有规律性的数据 1,逐行读取文件内容 //首先定义一个数据类型,用于保存读取文件的内容 class WeightRecord { String timestamp; flo ...

  10. 搜索(剪枝优化):HDU 5113 Black And White

    Description In mathematics, the four color theorem, or the four color map theorem, states that, give ...