Latest 1.2.4
License MIT
Platforms ios 6.0, requires ARC
Frameworks UIKit

VTMagic is a page container library for iOS, you can custom every page controller by different identifier if you need. It’s so easy to use!(中文手册传送门


preview image


  • If you found a bug, and can provide steps to reliably reproduce it, open an issue.
  • If you have a feature request, open an issue.
  • If you want to contribute, submit a pull request.



VTMagic is available through CocoaPods. To install
it, simply add the following line to your Podfile, and then import <VTMagic/VTMagic.h>:

pod "VTMagic"


  1. Download the project and drop VTMagic folder into your project.
  2. Import file VTMagic.h.
#import "VTMagic.h"


This library requires iOS 6.0+ and Xcode 7.0+.


To run the example project, clone the repo, and run pod install from the project directory first.


- (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;

or like this

#import "VTMagicController.h"

@interface ViewController : VTMagicController

@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];


You must conform to <VTMagicViewDataSource>. <VTMagicViewDelegate> and <VTMagicReuseProtocol> are optional.


- (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;


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

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

- (void)magicView:(VTMagicView *)magicView didSelectItemAtIndex:(NSUInteger)itemIndex {
    NSLog(@"didSelectItemAtIndex:%ld", (long)itemIndex);


This method will be called when page is reused, you should clear old data or reset content offset in here.

- (void)vtm_prepareForReuse {
    NSLog(@"clear old data if needed:%@", self);


Appearance methods

VTMagic will automatically calls the appearance callbacks when user switches the page, maybe you should do something in here, e.g. refresh page info.

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];

    // do something...

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];

    // do something...

Get magicController

You can get the nearest magicController in any child view controller which is conforms to <VTMagicProtocol>, after you import file VTMagic.h.

NSInteger currentPage = self.magicController.currentPage;
UIViewController *viewController = self.magicController.currentViewController;

Switch to specified page

You can switch to some specified page.

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

Get specified view controller

You can get any page controller by page index, it will return nil if the page is not on the screen.

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


VictorTian email: [email protected]


VTMagic is released under the MIT license. See LICENSE for details.

Latest podspec

    "name": "VTMagic",
    "version": "1.2.4",
    "license": {
        "type": "MIT"
    "homepage": "",
    "authors": {
        "tianzhuo": "[email protected]"
    "summary": "A page container for iOS.",
    "description": "VTMagic is a page container library for iOS, it can manage many different pages. VTMagicView contains a menu bar and a content view, all pages are add to content view.",
    "source": {
        "git": "",
        "tag": "1.2.4"
    "public_header_files": "VTMagic/VTMagic.h",
    "source_files": "VTMagic/VTMagic.h",
    "platforms": {
        "ios": "6.0"
    "requires_arc": true,
    "frameworks": "UIKit",
    "subspecs": [
            "name": "Core",
            "platforms": {
                "ios": "6.0"
            "exclude_files": "VTMagic/VTMagic.h",
            "source_files": "VTMagic/**/*.{h,m}"

Pin It on Pinterest

Share This