有些项目我们不想用UINavigationController或者UITabbarController管理视图,因为不够灵活,这时候我们可以自己建立一个视图控制器。
我们最开始只需要两个属性和两个方法,就可以让它运作起来。
@interface LBYNavigationController ()
{
/* 作为存放所有view controller的队列 */
NSMutableArray *pushQueue;
/* 本控制器的view,用于展示各个view controller的view */
UIView *mainView;
}
@end
Ta
- (void)viewDidLoad
{
[super viewDidLoad];
[ 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队列、视图切换
* 可以为渐入渐出的两个视图控制器分别调用一些方法,方便我们管理
* 举个例子,我们调用了viewWillDisappear和viewWillAppear方法 */
- (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];
}];
}