VTMagic的使用介绍

作者: 九流书生 | 来源:发表于2016-06-05 17:55 被阅读17904次

VTMagic

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

特性概要

  1. 每个页面都是一个完整的控制器,友好支持个性化自定义;
  2. 页面切换时能准确触发相应的生命周期方法(viewWillAppear:等),便于管理各自页面的数据加载和其它逻辑处理;
  3. 导航栏支持多种布局样式,包括自适应文本宽度、自动平分、居中布局以及自定义宽度等;
  4. 可以在任意子控制器中,通过self.magicController获取最近的上层主控制器,方便跨层级处理逻辑;
  5. 支持内嵌webview,若滑动手势无法响应,可以通过handlePanGesture:解决;
  6. 支持页面重用和横竖屏切换;
  7. 更多特性请参见VTMagicView.h文件。
预览图

使用

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

pod "VTMagic"

提示:在使用Pod的过程中可能会遇到无法搜到VTMagic的情况,这是因为VTMagic最近才上传到CocoaPods,你需要更新一下本地的Pod仓库:$ pod repo udpate,或者你也可以尝试一下升级Pod:$ sudo gem install cocoapods $ pod setup

当然,假如你们的项目暂时还不支持Pod,你可以先下载VTMagic,然后再将文件夹VTMagic拖到你们的项目里面,最后再import头文件VTMagic.h即可。

import "VTMagic.h"

集成

关于VTMagic的集成方法主要有以下两种:
1. 直接实例化VTMagicController对象,然后添加到当前控制器中。

- (void)viewDidLoad
{
    [super viewDidLoad];

    [self addChildViewController:self.magicController];
    [self.view addSubview:_magicController.view];
    [_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协议

主要用于在主控制器中处理页面切换事件。当子页面显示或消失时,会触发viewDidAppeare:viewDidDisappeare:代理方法;当menuItem被点击时,会触发didSelectItemAtIndex:方法。

- (void)magicView:(VTMagicView *)magicView viewDidAppeare:(__kindof UIViewController *)viewController atPage:(NSUInteger)pageIndex
{
    NSLog(@"pageIndex:%ld viewDidAppeare:%@",pageIndex, viewController.view);
}

- (void)magicView:(VTMagicView *)magicView viewDidDisappeare:(__kindof 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.collectionView setContentOffset:CGPointZero];
}

其它

  • 你可以在任意子控制器中,通过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,这是对作者最大的鼓励和支持,拜谢!!!假如你有更好的想法或方案,也欢迎提交pull request!!!GitHub地址

下一篇文章:VTMagic的使用介绍(二)

相关文章

  • VTMagic的使用介绍

    VTMagic 有很多开发者曾尝试模仿写出类似网易、腾讯等应用的菜单分页组件,但遍观其设计,大多都比较粗糙,不利于...

  • VTMagic的使用介绍(二)

    前言 距离VTMagic正式开源已经过去整整一个月,这短短的时间里收获了九百多颗star,在GitHub月榜Obj...

  • UI控件和动画特效

    iOS开发UI篇--YXFilmSelectView(一个酷炫的电影选票View) VTMagic 的使用介绍

  • VTMagic适配iphoneX系列

    由于VTMagic作者老哥已经没有更新了。iphoneX系列适配并没有做。但是很好修改。 1、找到VTMagic库...

  • VTMagic框架数据重复问题

    Git地址: https://github.com/tianzhuo112/VTMagic Git上有VTMagi...

  • 关于使用VTMagic 后不响应系统侧滑手势返回上级页面的问题

    VTMagic最底层的容器view其实也是scrollView,所以我们要找到它,重写下手势识别就好了 查看源代码...

  • 6.NinaPagerView和VTMagic,LyScroll

    1. NinaPagerView的使用(选中的字体会发生变大) 下面讲解使用的方法(推荐使用) NinaPager...

  • 3.STREAM

    1.Stream使用介绍 2.FS的使用介绍 3.Buffer使用介绍 4.Events使用介绍 5.有个例子可以看下

  • Vim的使用介绍

    Vim是什么 Vim是从vi发展出来的一个文本编辑器,其代码补充,编译及错误跳转方便编程的功能特别丰富,在程序员中...

  • RWidgetHelper的使用介绍

    说明 在Android开发中经常需要实现,基础控件的:圆角,边框,Gradient渐变,State各个状态的UI样...

网友评论

  • 马克雅:请问我要手势滑动返回上一个Controller要怎么做呢
  • me_bingo:你好,有方法可不可以不用重新机制,就是强引用了,让子控制器不销毁
  • _Andy_:写了一个Demo 有需求的可以看看
    VTMagic 搭建一个新闻类APP及使用心得
    https://www.jianshu.com/p/919b010c79a1
    _Andy_:@me_bingo 不可以
    me_bingo:可以不可以不用重新机制,就是强引用了,让子控制器不销毁
  • 尼古拉斯骄傲:这个可以添加view么?
  • cdc9cbfa9771:你好,我想问一下,你这个支持后台返回的数据来创建viewcontrller?
  • 龙龙_龙:你好,请问这个轮子能根据后台返回多少个数据来创建多少个子控制器嘛?感觉子控制器的个数都是写死的,能麻烦大神可以帮忙给点思路嘛。
  • 悠闲的拖鞋:如果想在导航条上面加个UIView,请问怎么操作。
  • 心语风尚:有多少个鼻标题 就有多少个控制器吗
  • 管家頗:有swift版吗
  • 管家頗:有swift版吗?
  • 长春悲哀程序员:大神您好,我现在有个问题。 就 是如何修改。 滑动后的颜色。 我现在的颜色都是红色的。我想修改成别的颜色。一直没找到方法。
  • 76c37b73b424:大神,我想滑动界面的时候隐藏一下导航栏 就是向上滑动隐藏、向下再出来 应该怎样去实现呢?
  • 何康老鬼:有没有适配iOS11? 不更新了么?
  • Doliant_H:不错~之前自己有写过类似的东西一直也没想着撸成轮子
  • 带你去旅行:你好 请问这个问题 Unbalanced calls to begin/end appearance transitions for <VTGridViewController: 0x7f89e50009a0>. 这个是只改了您demo中气泡界面中 [self.magicView reloadDataToPage:1];
    这个代码 0改为1 左划就报这个动画未结束的问题
  • chvince:支持,tableview重用不怎么会,每次tableview数据都是2种!
  • Baoger: 你好,首先非常感谢你的框架,我的项目集成了进去。不过现在有个新需求,就是要求上下滚动视图的时候,要求菜单栏也能一起滚动,类似tableView的headView,滚到顶部的时候不能再滚动,不知道能不能实现
  • 小虾57:- (UIViewController *)magicView:(VTMagicView *)magicView viewControllerAtPage:(NSUInteger)pageIndex {
    NSLog(@"----:%ld",pageIndex);
    MenuInfo *menuInfo = _menuList[pageIndex];
    }

    这个方法好怪异,pageIndex不是按照当前页面下标来的,是错乱的,导致子页面数据一直在重复。无法定位到当前页面的数据。
  • _八阿哥:老哥,swift能用这个框架吗
  • bu忘粗心:已集成 感谢作者
  • 月夜芳华:我想在导航栏左侧添加两个可以滑动的控制器!要怎么修改
  • 羊肉泡馍啊:我想问下可以子控制器可以是sb的吗?
    FighterRay27:为什么我子控制器使用 SB 中的 VC 就不行显示 VC 上面的 View 呢?
  • fd565ceeb15b:你好请教一个问题,我需要实现既有导航栏又有菜单栏这种的,就是你首页的那种效果。但是当我向上滑动的时候需要隐藏菜单栏,向下滑动的时候菜单栏出现,我该怎么修改一下,谢谢。
  • 0053a867d530:大神我能问你一下 我这边有个segment 有三个VC A B C 并列状态 A有个按钮 点击按钮Push到D界面 我想D界面直接返回B界面 可以么。
  • 0a7ea1459b80:你好,请问我要是自定义导航栏,比如“新闻,消息”两个分栏,我要在每个分栏之间我要加一条分界线,应该怎么做呢
  • LennonLin:左滑切换页面的首页与tableview的左滑删除功能重叠了,我关闭了滑动的功能,想请问有方法可以不关闭滑动,左滑cell响应的是cell来删除吗
  • DDDDeveloper:pod "VTMagic"还是pod ‘VTMagic’,我怎么记得是单引号?
  • LennonLin:可以进来的第一个界面不是0那个吗?而是第二个?有办法吗
    LennonLin:@九流书生 已经搞定了,谢谢
    九流书生:@lennonLin 可以,调用reloadDataToPage:即可。非常抱歉,最近忙成狗:dog:
  • 43068c728600:集成了你的框架,在有气泡的样式下,我给导航上面的按钮设置了白天和夜间的选中的颜色,但是只有一种有效果,要么是白天的,要么是夜间的 请问有什么好的解决方案吗
  • Ths:请问如果某个页面没有数据,就不显示这个页面,该怎么弄呢,我看那个刷新标题的方法说不改页面的数量和顺序,我自己也试了,会出现index对不上的bug.
    Ths:@九流书生 一直崩溃在viewControllerAtPage方法里面的MenuInfo *menuInfo = _menuList[pageIndex];数组越界了.我不知道为什么pageIndex为什么不对了.
    Ths:@九流书生 大神,我加了你的小号好友,可以详细的问一下吗.这块,我是从子控制器请求到数据后回调新的menu给主控制器,然后主控制器刷新后,index对不上.
    九流书生:@Ths 你好,页面的显示是根据menu决定的,如果不想显示某个页面,你只需要把相应的menu去掉,然后重新调用一下reloadData或reloadDataToPage:方法即可。
  • imageURL:这个好强大 , 晚点拆分出来 一部分功能用
  • 5a182ee84fe0:非常感谢楼主带来这么好的开源库,十分感谢
  • 2961adb20e72:楼主,如果要实现上滑隐藏magciView的header,这个时候里面的tableview就会出现底部有一小段时间的空白,闪一下,感觉十分的不流畅。现在的处理方式是在外面加一层scrollview,让scrollView的contentsize的height = 屏幕高度 + magciView的header, 请问有没有更好的处理方式
    fd565ceeb15b:你好,我也需要滑动的时候隐藏菜单栏,请问你是怎么做的?谢谢
  • 3be05ed9903c:还有调用这个 [_magicController switchToPage:index animated:YES];方法就会的打印这样的警告Unbalanced calls to begin/end appearance transitions for <XHKnowledgeBaseListVC: 0x7fc2a1e40640>.是什么原因?
    九流书生:@帅提莫 说错了,应该是刷新和切换那块。。
    九流书生:@帅提莫 你可以看看下一篇文章,关于生命周期那块的。
  • 3be05ed9903c:你好,现在有一个问题,我通过 [_magicController switchToPage:index animated:YES];这个方法到指定的选项卡时为什么不走- (void)viewDidAppear:(BOOL)animated 这个方法?
    3be05ed9903c:@九流书生 就是通过 [_magicController switchToPage:index animated:YES];这个方法跳转到指定的选项卡时不会走- (void)viewDidAppear:(BOOL)animated这个方法 ,其他的通过滑动或者点击选项卡时都会走的 不知道为什么?
    3be05ed9903c:@九流书生 跳转另外一个界面然后选择一个选项卡通过通知调用这个 [_magicController switchToPage:index animated:YES];方法,我在调用这个方法前或者后加上这句[_magicController.magicView reloadData];任然不会走- (void)viewDidAppear:(BOOL)animated这个方法啊 导致都没办法刷新数据了
    九流书生:@帅提莫 你在什么时候调用的这个方法?在此之前有没有调用过reloadData?
  • qBryant:多谢分享。。mark学习! :+1:
  • kinmo:慕名而来,楼主很强势啊
    九流书生:@July丶ye 哪里,多谢支持!!:beer:
  • wowJesse:你好,我想获取到当前页面的indexpage,但是在- (UIViewController *)magicView:(VTMagicView *)magicView viewControllerAtPage:(NSUInteger)pageIndex里获取到的不是当前展示的page
    九流书生:@wowJesse self.currentPage就是当前页面索引。
  • 30234c45ea6c:很不错,值得学习,看得出楼主很有耐心,大赞
  • dd9bd9b8059b:非常好用的组件,强列支持。
    九流书生:@Hegel_SU 唔,非常你的支持感谢,有问题随时反馈!:beers:
  • dd9bd9b8059b:___________________________
    | < 返回 大标题 + |
    |___________________________|
    |小标题1 小标题2 小标题3 |
    |___________________________|
    | 各小标题对应内容 |
    |___________________________|

    遇到这种就不知道怎么用这个组件了。
    九流书生:@Hegel_SU :clap:
    dd9bd9b8059b:@九流书生
    嗯,实现了,不隐藏Nav,insert = new ContentInsert(44,10,0,10);
    设置属性navigationHeight = 88
    搞定
    九流书生:@Hegel_SU 你好,顶部可以用系统导航,然后下面用VTMagic。
  • 回味岁月:您好 想问下 能不能拓展一个类似简书APP 个人主页那种上面带head然后上拉head隐藏下拉出现的那种效果
    回味岁月:@清风l 试试SwipeTable这个
    fd565ceeb15b:你好 请问这种效果你实现没有
  • LonelyBanana:Definition of '' must be imported from module 'VTMagic.UIColor_Magic' before it is required 更新到项目中会有这个报错 :flushed:
    LonelyBanana:用pods就会有这个报错!我拖进项目就正常了
    LonelyBanana:7.3的版本:smile:
    九流书生:@LonelyBanana 请问你的Xcode是哪个版本??
  • angryboy:我现在遇到的问题是 我每个页面布局一样但是数据都不一样, VC三个会复用,该怎么修改?在线等 :smile: 谢谢大神
    九流书生:@angryboy 你好,关于复用请参见工程Home模块中的处理。。
  • 樱木艾克:书生童鞋 首先感谢您开源了这么好的东东 真的谢谢 不过在iPhone5S,7.0.5上有个bug 就是说点击顶部menuItem时按钮正常颜色还有选中颜色都正常 不过滑动scrollView时按钮选中颜色正常,但未选中按钮颜色不正常都消失了 一开始加载界面的时候正常呢 不过滑几下都消失了 希望修修呗 谢谢
    樱木艾克:@九流书生 :smile: :clap: Thanks
    九流书生:@艾克酷爱樱木 同学你好,这两天发版,忙成狗,我今天看一下哈。:cold_sweat:
    樱木艾克:@艾克酷爱樱木 :cry: 直接被忽视 也谢谢 :v:
  • 微光星芒:可是这样还是需要创建多个控制器,并且对栏目进行添加的时候,还是需要创建新控制器吗?
    九流书生:@微光星芒 更新工程,参见Center模块。
    微光星芒:@九流书生 嗯,好的. 我的确是有点困惑. 静等你的Demo.
    九流书生:@微光星芒 viewControllerAtPage:方法中直接返回相应属性对象即可,如果依然困惑,可以稍等一下,这两天我会完善一下demo。
  • 微光星芒:书生, 若是每个界面都不一样,又该怎么进行复用呢? 之前使用的时候,界面都是一致的,只是请求的数据不一样. 但现在的需求是每个界面都是不一样的,这样的话又该怎么复用呢?
    九流书生:@微光星芒 当然,如果不像用属性的方式,你也可以用不同的reuseId来区分,不过这样没有前一种来得方便。
    九流书生:@微光星芒 如果每个页面都不一样,可以直接将各个页面初始化并作为主控制器中的属性,然后在数据源方法viewControllerAtPage:中直接返回相应页面控制器对象即可,可以不再调用dequeueReusePage方法。
  • 一念知否:使用时,好像有个bug,当滚动或滑动到其他不相邻的界面时,此页面的数据会变化。
    一念知否:已解决复用问题
  • 哆啦爱懵:当我点击当前tableview控制器push进入另一个界面 编辑信息后返回 当前这个控制器在viewDidAppear里面 reloaddata都没反应了?调用magic的reloaddata就会崩溃掉---(其他几个控制器修改时是按钮触发刷新的,不会崩溃, 必须要magic跟tableview同时reloaddata界面才会刷新)
    哆啦爱懵:@九流书生 崩溃在SDAutoLayout这个框架里 算CGRect的地方 不知道这俩为啥合不来 (几个子控制器的数据是父控制器请求然后保存到数据库 再赋给子控制器的 每次修改完就更改数据库并刷新子控制器界面 大概是这么个情况)
    九流书生:@哆啦爱懵 你好,你打一个全局断点看一下崩溃在什么地方,另外你可以把podfile改为 pod 'VTMagic', :git => 'https://github.com/tianzhuo112/VTMagic.git',看看最新代码是否仍然有问题,如果还有问题,请及时反馈并附上详细描述。
  • f3178190b1a5:实例化VTMagicController对象,加到控制器中Unbalanced calls to begin/end appearance transitions for <WSSearchFilmTVResultViewController: 0x160856180>. 这个错误是什么原因
    九流书生:@活动活动吧 你好,请问你是在哪个方法里面调的reloadData方法,或者switchToPage:方法?如果你用的是pod,请这样写pod 'VTMagic' :git => 'https://github.com/tianzhuo112/VTMagic.git';如果不是,请更新到最新代码,然后再看一下是否还有这个问题。
  • _Patrik_:请问能否自定义被加载的 VC 的个数?默认加载左右两边的话划到左右两个 VC时另一边的一个就会被 reload 了,有什么办法让它不被重新加载吗?
    _Patrik_:@九流书生 不是的 我希望让他加载三个或三个以上页面 有这样的方法吗
    九流书生:@_Patrik_ 你好,VTMagic默认采用预加载机制,你可以通过修改属性needPreloading为NO来关闭该机制,关闭后只加载当前显然的页面,不再预加载两侧页面。
    _Patrik_:@_Patrik_ 没描述清除,当 VC 为三个或者三个以上的时候可能有最左或最右的一个 VC 被重新加载,有什么办法让他不被释放?
  • 伊泽冠铭:似乎不能更改它的frame。。。
    九流书生:@伊泽冠铭 不用客气!
    伊泽冠铭:@九流书生 谢谢,用了感觉挺棒的~
    九流书生:@伊泽冠铭 你好,更改frame就像平时更改UIViewController的view的frame一样
  • c7d2850efb70:您好 我想问一下 继承了VTMagicController 底部的tabbar 颜色变成了灰色 怎么解决了 没找到这个设置
    九流书生:@Lit_xiao 颜色变灰是因为edgesForExtendedLayout属性为UIRectEdgeNone,若想实现半透明效果,你可以参考demo中translucent的提交。
  • LightReason:为楼主点赞, 无意间发现了,虽然目前项目中没有用到,还是clone了下来,点了Star,目前课余研究中,又不懂得会来@你哟。
    九流书生:@LightReason 如有问题,欢迎及时反馈!!:beers:
  • A天天涨不停:虽然只是看了还没用,但不管结果如何,这种开源的精神都大大滴不错,赐你凉民证。先收藏,以后用上了第一时间来找你麻烦。哈哈~~~
    A天天涨不停:@九流书生 嗯。
    九流书生:@水瓶座_iOSer 多谢大人厚爱,有问题可以随时召唤小生!:grin:
  • 乌戈勒:您好,顶部导航栏滑块高度VTSliderStyleDefault样式下,设置sliderHeight没有起到效果,看了代码,好像这个在VTMagicView的sliderView第一次初始化的时候才设置,就是它的height这个属性,后面好像没有设置了。
    乌戈勒:@九流书生 除了上面这个问题,另外itemSpacing可以设置两个导航菜单item文本之间的间距,但是不能设置第一个Item的做偏移量originX ?
    乌戈勒:@九流书生 我通过下面的方式集成,但是设置sliderHeight不起效果 - (VTMagicController *)magicController
    {
    if (!_magicController) {
    _magicController = [[VTMagicController alloc] init];
    _magicController.magicView.againstStatusBar = YES;
    _magicController.magicView.navigationColor = [UIColor whiteColor];
    _magicController.magicView.navigationHeight = TopBarHeight;

    _magicController.magicView.sliderColor = [UIColor HexadecimalColor:@"ff6a6e"];
    _magicController.magicView.sliderStyle = VTSliderStyleDefault;
    _magicController.magicView.sliderHeight = 10.0f;
    _magicController.magicView.sliderExtension = 5;

    _magicController.magicView.layoutStyle = VTLayoutStyleDefault;
    _magicController.magicView.switchStyle = VTSwitchStyleDefault;

    _magicController.magicView.itemScale = 18.0f / 15.0f;
    _magicController.magicView.needExtendedBottom = YES;

    _magicController.magicView.dataSource = self;
    _magicController.magicView.delegate = self;
    }
    return _magicController;
    }
    九流书生:@掏粪龙 你好,设置sliderHeight仍然是有效的,在updateFrameForSubviews方法中(sliderFrameAtIndex:)会自动修正。
  • 一只特立独行的道哥:不错,学习了,以后参考用上
    九流书生:@足跼 多谢支持!!!
  • Codepgq:好东西!收藏先,项目中暂时不需要,可以研究研究。
    九流书生:@纸巾艺术 嗯,多谢支持!
  • 马什么梅:大神 这个滑动返回功能是不是没有了哇
    马什么梅:@九流书生 哦哦 谢谢大神
    九流书生:@马什么梅 你好,关于这个问题,你可能需要自定义导航,然后设置interactivePopGestureRecognizer.delegate为导航本身,并实现代理UIGestureRecognizerDelegate。在接下来的版本中我会尝试优化,以使其变得更加友好。。
  • 乌戈勒:你好,我这边接入这个框架,发现点击状态栏,scrollview没有置顶
    乌戈勒:谢谢,我试下
    九流书生:@掏粪龙 你好,因为存在多个页面的问题,你需要在页面切换的时候(生命周期方法中)手动改变scrollsToTop的值,viewWillDisappear:时置为NO,viewDidAppear:时置为YES,具体可参考demo中的VTGridViewController.m文件。
  • 微光星芒:书生,我在向子界面传递数据的时候发现一个问题,子界面有一个自动刷新功能,我打了两个断点,发现先走子控制器的舒心方法,后走- (UIViewController *)magicView:(VTMagicView *)magicView viewControllerAtPage:(NSUInteger)pageIndex; 这个方法,可是传值就是在这个方法中进行的,这样传值永远是落后一步,根本无法进行. 子界面的刷新方法是写在viewWillAppear中,但是换成viewDidAppear中,也是一样.先执行刷新方法,再执行传值传值那个方法
    微光星芒:@九流书生 在viewWillDisappear中我的确是取消了帅新,这个应该是没问题的.
    九流书生:@微光星芒 此外,viewControllerAtPage:方法中加载的不一定是当前显示的页面,也可能是预加载的下一个页面。
    九流书生:@微光星芒 你好,当主控制器的生命周期方法触发的时候,子页面也会自动触发,之后realoadData或切换页面,仍然会继续触发其生命周期方法。你看一下在viewControllerAtPage:之后是否有触发响应的生命周期方法。还有,通常我们需要在viewWillDisappear:中取消掉网络请求。
  • Gxpzy:[MenuInfo length]: unrecognized selector sent to instance 0x7fc68bc28820
    这是咋回事呢
    Gxpzy:@九流书生 没有想获取啊,我昨晚才发现你这个宝贝,挺兴奋的,今天想用到我的demo中的,折腾半天还是没弄好,我的qq836812350,帮我看一下吧,我发你工程,谢谢
    九流书生:MenuInfo没有length方法,你是不是想获取Title的length??
  • Randy1993:喜欢
    九流书生:@Randy1993 多谢支持!!:smile:
  • 微光星芒:你好,我在第二个表视图中添加了MJRefresh,发现在第四个栏目的时候,数显界面会向下偏移,并不是正常的刷新界面.我想请问,有没有类似这样情况的反馈?
    微光星芒:@微光星芒 已经解决了,我不小心调了两次刷新的方法.......(尴尬)
    九流书生:@微光星芒 一种解决方法是在页面中手动修正contenInset的异常问题。
    九流书生:@微光星芒 MJRefesh好像确实有这问题,同一页面中如果有两个表视图,其中一个的contenInset就会异常,这应该是MJRefresh内部处理的问题。
  • 屮艸芔:继承的VT,但是不走viewdidAppeare和viewdidDisappeare方法,却走didselectitematindex方法,还有那个currentPage一直是0,是我没设置什么属性吗
    九流书生:@屮艸芔 嗯,那和【首页】的使用应该是一致的,页面切换时子控制器的viewDidAppear等方法会触发,主控制器则依赖于更上一级的逻辑。
    屮艸芔:@九流书生 加到tabbarcontroller上了
    九流书生:@屮艸芔 你好,建议先更新到最新版本,关于用法可以参考demo中的【首页】模块。对了,你继承的控制器是添加到其它控制器上的吗??
  • 微光星芒:我又遇到问题了,我在给第一个界面赋值的时候,是在第一个界面的控制器初始化的时候,传入了数组,但是奇怪的是并没有走tableView的代理方法.请问正确的写入数据的方法该是怎么样的呢?
    微光星芒:@九流书生我下载了最新的Demo,我看到了 MenuInfo *menuInfo = _menuList[pageIndex];这个方法,我不是很明白为什么要传递上方的标题; 如果这里传递的是对应界面的数据可以吗? 如果只是每一次初始化的时候传入数据,在不需要创建的时候,数据就无法传递了. 所以这个MenuInfo,只是能够传递上方的标题吗?
    九流书生:@微光星芒 关于tableView的代理方法调用问题,你需要确保执行了tableview的reloadData方法。至于数据传递,你可以参考最新的demo。如果可以,页面最好能独自管理自己的数据,以保证页面的独立性和可替换性。最后,最新版已更新到1.2.2,欢迎及时更新。
    微光星芒:书生,急求啊......
  • 风火连城:不错,不错,MARK备用
    九流书生:@风火连城 多谢支持!!:beers:
  • 微光星芒:您好,我想请问怎样修改导航栏上的文字颜色呢? 我找到了修改slider的颜色,但是没有找到修改字体颜色的方法...
    九流书生:@微光星芒 在menuItemAtIndex:方法中修改menuItem的文本颜色即可,也就是UIButton的文本颜色,字体也在这里修改。
  • GeekFounder:你好,我又来了,VTMagicControllert他会自动先加载旁边的控制器,怎么设置才能让他只加载当前选中的控制器呢?
    九流书生:@SteveZhong 你好,最新版1.2.3已支持关闭预加载功能,只需将needPreloading置为NO即可关闭预加载逻辑。
    GeekFounder:@九流书生 这样的话那我加载数据就要放在viewdidappren了,因为我加载的数据大,现在这样预加载导致我同时加载两个页面的数据,虽然滑动的时候流畅,但是刚进来的时候是卡顿的,要加载完才能动。
    九流书生:@SteveZhong 你好,为了保证切换的流畅,VTMagic采用了预加载功能,我们一般只会在viewDidLoad方法中完成一些基础配置,仅当viewDidAppear:方法触发的时候页面才真正显示。https://github.com/tianzhuo112/VTMagic/issues/10
  • 微光星芒:您好,我刚才发现一个问题:比如当前是第五个界面,我点击进去,进入详情界面,然后返回,这个时候,它返回到的不是第五个界面而是第一个界面,请问这种情况曾经出现过吗? 我是直接实例化VTmagic 这个控制器 ,而不是是继承,因为项目中的控制器都是自定义的......
    九流书生:@微光星芒 不客气
    微光星芒:@九流书生 您好,我找到原因了,的确是在viewWillAppear中调用了这个方法,将这个方法注释调就可以了... 多谢
    九流书生:实例化和继承的效果一样,这种情况你需要看一下在进入详情后是否有调用过方法switchToPage:
  • 微光星芒:您好,请问滑动下方的视图时,是在哪个方法中进行数据的传递的呢?
    九流书生:@微光星芒 不客气!!
    微光星芒:@九流书生 好的,谢谢你的解答,如果出现其它问题,还是需要你的帮助呢,麻烦了......👍
    九流书生:@微光星芒 建议你在主控制器的viewControllerAtPage:方法中传递对应的菜单模型(menuInfo),然后在子控制器的viewDidAppear:方法中根据需要刷新数据(如果有本地数据可能不需要自动刷新,看业务需求),vtm_prepareForReuse方法会在页面被重用的时候调用,这个时候你可能需要清除一下旧数据。需要补充的是,当子控制器的菜单信息改变时,你或许需要预加载本地数据(子控制器可以重写menuInfo的setter方法),而不是每次都请求最新数据。
  • 休威廉姆斯1: 大神 你好 我怎么刷新 导航条上的频道数据呢
    九流书生:@niuniuniuge 你好,你只需要调用一下reloadData方法即可。
  • 西西西瓜sama:你好 假如我想实现网易新闻这种,点击右上角+号,dismiss以后动态切换controller不知道是否能和vtmagic相融合.
    九流书生:@西西西瓜sama 关于这个你可以看看网易的实现,它后面的页面并没有消失,只是盖了一层在上面,然后隐藏了底部TabBar。
    九流书生:@西西西瓜sama 你好,这个应该是没什么问题的,调试一下就好。
  • 倒骑毛驴看风月:大神,拜你为师,如何可以联系到你,想向你询问一些问题
    九流书生:@_Smile淰憶 年轻人,不要冲动,大神这个称谓不敢当!:sweat:如有疑问可以在GitHub上提交问题,或者也可以加我的小号:717510977。
  • 叶舞清风:跟新本地仓库有误 pod repo update
    叶舞清风:@九流书生 提示快捷键
    九流书生:@叶舞清风 提示的是什么错误??
  • 叶舞清风:pod 没有啊
    九流书生:这个不需要,它内部协议,VTMagicController已经实现了。
    叶舞清风:@九流书生 VTMagicProtocol 需要遵守吗?
    九流书生:@叶舞清风 你好,你需要先更新一下本地pod仓库$ pod repo udpate,参见本文中[使用]部分的提示!
  • bc319cacea6f:我自己也尝试写了一个类似的例子,但是viewWillAppear:等方法不会被调用,请问你是怎么解决的
    bc319cacea6f:@九流书生 谢谢:stuck_out_tongue_winking_eye:
    九流书生:@hhh_hhh 你好,这个需要手动触发系统方法beginAppearanceTransition~!
  • 15bb0c077910:牛逼 感谢大神的分享 我们公司项目刚好用到 以前用的都是可扩展性太差了 万分感谢
    九流书生:@如是_我闻 哈哈,不用客气,如有问题欢迎随时反馈,目前仍在努力完善中~! :smile:
  • iOS开发那些事:很不错!学习
    九流书生:@大兵布莱 多谢支持!!
  • 颓阿废:您好,请教您一个问题。我在其中一个子vc上添加pan手势的话页面滑动切换不响应,优先响应的是我的pan手势,这个能解决吗?
    九流书生:@颓阿废 问题的核心在于你在子控制器中添加了pan手势,导致事件无法继续传递,最理想的解决方法应该是合理准确地控制pan手势的响应与否。
    九流书生:@颓阿废 你好,你应该在恰当的时候禁止Pan手势的响应(通过UIGestureRecognizerDelegate代理实现响应控制),这样事件才能继续向上层传递,页面滑动切换才会有效;某些情况下,页面滑动会失效,这个时候我们可以通过添加pan手势让VTMagic得以响应滑动事件,做法是在任意子控制器中执行如下代码[self.magicController.magicView handlePanGesture:recognizer],这部分可以参考demo中Data模块中的实现。
    颓阿废:我是用pods导入的,用的直接实例化的方法。比如我有两个子控制器,就像你demo里的“居中页面”,这个是我想在左边的页面加上滑动手势,具体怎么加呢?您在magicView.h里的handlePanGesture方法我该在哪儿调用呢?在左边这个子vc里还是“居中”vc里呢?
  • 叶舞清风:请问这个轮子是否支持git集成???
    九流书生:@叶舞清风 你好,你指的是使用CocoaPods集成?
  • 叶舞清风:No code signing identities found: No valid signing identities (i.e. certificate and private key pair) matching the team ID “2Y55XFEVRS” were found.
    这个是什么情况啊,亲???/Users/panchengping/Desktop/屏幕快照 2016-06-17 上午10.10.24.png
    九流书生:@叶舞清风 你好,简书评论中无法查看图片,如果需要提交图片你可以去Github创建一个新的issue,然后上传附件,或者也可以加我小号:717510977~
  • 叶舞清风:谢谢分享
  • 泰好笑勒:一直在摸索,终于见到了。牛 逼
    九流书生:@爱笑的豆豆 多谢夸奖~! :smile:
  • iOS_凯:感谢楼主分享,但是cocopod下载不成功呀,不知道什么原因
    九流书生:@iOS_凯 你好,VTMagic是最近刚上传到pod的,你需要更新一下本地仓库或升级一下pod,命令如下:$ pod repo update 或 $ gem install cocoapods.
  • 古流风:你好,VTMagic 每过3个vc就会被复用,这个是在哪里修改的
    九流书生:@走刀口的人 你好,请问你是希望重用时修改页面数据吗?如果是的话,你应该重写vtm_prepareForReuse方法,该方法会在页面被重用的时候调用。
  • a151e01f71ea:Analyzing dependencies
    [!] Unable to find a specification for `VTMagic`? 怎么办
    九流书生:@傆嚸 你好,这种问题是因为本地的pod仓库不包含VTMagic.podspec配置文件,你需要更新一下本地仓库或升级一下pod,命令如下:$ pod repo update 或 $ gem install cocoapods.
  • a151e01f71ea:我pod 加不进去啊
  • fda53e592945:哥们 你是乐视的吧 这个vt有严重的内存泄露
    九流书生:@小道飞熊 人呢???:cold_sweat:
    九流书生:@小道飞熊 你好,请问你指的是什么情况下有内存泄漏?? :fearful:
  • acd4fdeb9c7b:UIColor+Magic.h 报错..
    static const VTColor VTColorZero;
    显示Definition of '' must be imported from module 'VTMagic.UIColor_Magic' before it is required
    九流书生:@BonVovage 确认一件事,在此之前有这个问题吗??
    acd4fdeb9c7b:@九流书生 通过pod,看到你更新后,就remove又重新pod了一遍,还是有这个问题。现在先注释掉,不知道会不会有影响
    九流书生:@BonVovage 请问你是通过pod添加的,还是下载后拖进工程的?
  • _Andy_:大神 这框架不用pods 怎么集成
    _Andy_:@九流书生 ok 谢谢
    九流书生:@大苏Andi 你好,你可以先把项目clone或下载到本地,然后将主目录下的VTMagic文件(路径:VTMagic/VTMagic)拖到你们工程中,然后再import VTMagic.h头文件即可!
  • 60343a0ad510:git README上应该加几张展示gif图的。
    60343a0ad510:@九流书生 :joy: 帮你添加了。
    60343a0ad510:@九流书生 这篇文章上的图拉进去也可以,展示图更有助于别人直观的了解到你这个库的作用。
    九流书生:@晋先森 还可以这么干??我琢磨一下~ :joy:
  • 65f20d8e1459:好赞好赞!
    九流书生:@newbieDev 谢谢谢谢!
  • 小楼东风:你QQ多少,我有个问题想问你。
    九流书生:@小楼东风 你好,如下717510977,欢迎随时咨询。
  • Ryan文濤:提一个小小的意见,就是假如很快速的滑动的话,上面的scrollView不会跟着滚动的。需要很慢的滑动,上面的scrollView才会跟着滚动。
    九流书生:@Ryan文濤 最后一个建议很好,但UIButton在缩放上相比UILabel更加复杂,实现效果不是特别理想,暂时还不支持scale特性,正在琢磨中,欢迎随时提供任何建议~
    Ryan文濤:@九流书生 嗯,我知道:smile:但是有强迫症患者的话就有些不习惯:sweat_smile::sweat_smile::sweat_smile:上面的菜单有根据滑动距离变大变小吗?
    九流书生:@Ryan文濤 你好,这样的处理是为了减少不必要的性能开销,尽可能保证快速切换的流畅性,当滑动停止的时候,顶部菜单栏才会自动修正位置,非常感谢你的反馈~!
  • 39ea96b65e42:点赞加好评~ :smiley:
    九流书生:@我叫蓝炎钦 非常感谢大家的支持,感动ing~!! :blush:
  • WhisperKarl:早点看到就好啦! 感谢
    九流书生:@WhisperKarl 不客气,如有疑问,欢迎随时反馈~!
  • 07c6cf848dc8:你好,请问我push一个VC后,导航栏怎么消失了?是不是要在push前设置什么
    九流书生:@Aiverson 你只需要在被push出的页面的viewWillAppear:方法中加上如下代码即可显示系统导航[self.navigationController setNavigationBarHidden:NO animated:YES];至于VTMagic的导航,它只是一个自定义的导航视图,不会在下一级显示。参见VTDetailViewController,点击任意cell即可进入detail页面。
    Aiverson:@九流书生比如index0的控制器 PUSH出来一个子控制器怎么hide VTMagic的导航,而使用系统的,pop 到index0又使用VTMagic的导航,我现在系统的直接在VTMagic的导航下面,求解!
    九流书生:@Dan1el 你好,VTMagic的导航是内部自定义的导航,并非系统导航,如果你希望显示系统导航,那你需要在适当的位置(比如被push出来的页面的viewWillAppear:方法中)加上这样的一句代码[self.navigationController setNavigationBarHidden:NO],Demo中默认把系统导航隐藏了。
  • b2ac4f6c7117:去年写了一个类似的,下载看看怎么杨
    九流书生:@bocaicai 欢迎下载试用,静候反馈~!!
  • 三剑客之砍你一刀没商量:title有图片+文字的格式吗?
    九流书生:@三剑客之砍你一刀没商量 你好,你可以在数据源方法magicView:menuItemAtIndex:中自定义任意样式的menuItem(UIButton类型),当有图片时你可能需要适当调整itemSpacing的大小。

本文标题:VTMagic的使用介绍

本文链接:https://www.haomeiwen.com/subject/badrdttx.html