设计自己的NavigationController

有些项目我们不想用UINavigationController或者UITabbarController管理视图,因为不够灵活,这时候我们可以自己建立一个视图控制器。


我们最开始只需要两个属性和两个方法,就可以让它运作起来。


@interface LBYNavigationController ()

{

    /* 作为存放所有view controller的队列 */

    NSMutableArray *pushQueue;  


    /* 本控制器的view,用于展示各个view controller的view */

    UIView *mainView;           

}

@end

Ta


- (void)viewDidLoad

{

    [super viewDidLoad];


    mainView  = [[ UIView   alloc initWithFrame : [[ UIScreen   mainScreen bounds ]];

[   self.view addSubview: mainView];

}



/* 本控制器的push方法

 * 分为两个步骤:管理pushQueue队列、视图切换

 * 视图切换使用简单的淡入淡出效果,只做抛砖引玉 */


- (void)push: (UIViewController*)viewController

{

    //管理push队列

    if (!pushQueue)

    {

        pushQueue = [[NSMutableArray alloc] init];

    }

    [pushQueue addObject: viewController];

    

    

    //视图切换

    UIView *lastView = [mainView.subviews lastObject];


    viewController.view.alpha = .0f;

    [mainView addSubview: viewController.view];

    

    

    [UIView animateWithDuration: .4f delay: .0f usingSpringWithDamping: .9f initialSpringVelocity: .3f options: UIViewAnimationOptionCurveEaseInOut animations:^{

        

        if (lastView)

        {

            lastView.alpha = .0f;

        }

        viewController.view.alpha = 1;

    

    } completion:^(BOOL finished) {

        

    }];

}



/* 本控制器的pop方法

 * 依旧分为两个步骤:管理pushQueue队列、视图切换

 * 可以为渐入渐出的两个视图控制器分别调用一些方法,方便我们管理

 * 举个例子,我们调用了viewWillDisappearviewWillAppear方法 */


- (void)pop

{

    //管理push队列

    UIViewController *viewController = [pushQueue lastObject];

    [viewController viewWillDisappear: YES];

    

    [pushQueue removeLastObject];


    viewController = [pushQueue lastObject];

    [viewController viewWillAppear: YES];

    

    // 视图切换

    UIView *viewA = [mainView.subviews lastObject];

    UIView *viewB = [mainView.subviews objectAtIndex: mainView.subviews.count - 2];

    

    [UIView animateWithDuration: .4f delay: 0 usingSpringWithDamping: .9f initialSpringVelocity: .3f options: UIViewAnimationOptionCurveEaseInOut animations:^{

        

        if (viewA)

        {

            viewA.alpha = .0f;

        }

        if (viewB)

        {

            viewB.alpha = 1.0f;

        }

        

    } completion:^(BOOL finished) {

        

        [viewA removeFromSuperview];


    }];   

}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值