iOS开发学习之多视图转换

1??主视图控制器需要操作两个视图控制器

-menuViewController(菜单视图控制器)
-actionViewController(操作视图控制器)
2??需要使用到UIViewController中的四个方法
-willMoveToParentViewController
-removeFromParentViewController
-addChildViewController
-didMoveToParentViewController
3??需要使用UIView的一个方法xQX
-insertSubview:(UIView*)view atIndex:(NSInteger)index 
4??代码实现
MenuViewController.h
#import <UIKit/UIKit.h>

@class MenuViewController;

@protocol MenuViewControllerDelegate <NSObject>

- (void)menuViewDidSelected:(NSString *)identifier;

@end

@interface MenuViewController : UIViewController

@property (weak, nonatomic) id<MenuViewControllerDelegate> delegate;

// 选择菜单
- (IBAction)selectMenu:(UIButton *)sender;

@end
MenuViewController.m
#import "MenuViewController.h"

@interface MenuViewController ()

@end

@implementation MenuViewController

// 选择了菜单项
- (IBAction)selectMenu:(UIButton *)sender
{
    // 通过按钮的tag,告诉代理应该使用什么id去加载视图控制器
    NSString *identifier;
    
    switch (sender.tag) {
        case 0:
            identifier = @"First";
            break;
        case 1:
            identifier = @"Second";
            break;
        case 2:
            identifier = @"Third";
            break;
    }
    
    [_delegate menuViewDidSelected:identifier];
}

@end
ViewController.h
#import <UIKit/UIKit.h>
#import "MenuViewController.h"
#import "ActionViewController.h"

@interface ViewController :UIViewController <MenuViewControllerDelegate>

@property (weak, nonatomic) ActionViewController *actionController;
@property (weak, nonatomic) MenuViewController *menuController;

// 切换菜单视图
- (IBAction)toggleMenu:(id)sender;

@end
ViewController.m
#import "ViewController.h"

@interface ViewController ()
{
    // 菜单视图是否显示
    BOOL _menuViewIsShow;
}

@end

@implementation ViewController

// 根据菜单选择项设置当前操作的视图控制器,默认启动时,显示First视图控制器
- (void)setActionController:(ActionViewController *)actionController
{
    // 操作视图控制器,每次的变化都是根据菜单按钮的选项来变化的,因此,操作视图控制器是不固定!
    // 1. 需要删除原有的操作视图控制器
    // 1.1 将操作视图控制器的视图删除
    [_actionController.view removeFromSuperview];
    // 1.2 不再在视图控制器中显示
    [_actionController willMoveToParentViewController:nil];
    // 1.3 从主视图控制器中删除
    [_actionController removeFromParentViewController];
    
    // 2. 添加新的视图控制器
    _actionController = actionController;
    [self addChildViewController:_actionController];
    [_actionController willMoveToParentViewController:self];
    [_actionController.view setFrame:self.view.bounds];
    [self.view addSubview:_actionController.view];
}

// 菜单视图控制器,始终存在于应用中
- (void)setMenuController:(MenuViewController *)menuController
{
    if (_menuController == nil) {
        _menuController = menuController;
        // 1. 添加子视图控制器
        [self addChildViewController:_menuController];
        // 2. 让子视图控制器可以移入
        [_menuController willMoveToParentViewController:self];
        // 3. addSubView或者insertSubView
        [self.view insertSubview:_menuController.view atIndex:0];
    }
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    // 在这里把绿色的视图控制器推送出来,替代当前的主视图
    self.actionController = [self.storyboard instantiateViewControllerWithIdentifier:@"First"];
    // 同时还需要把菜单视图控制器初始化
    self.menuController = [self.storyboard instantiateViewControllerWithIdentifier:@"Menu"];
    
    [self.menuController setDelegate:self];
    
    _menuViewIsShow = NO;
}

// 切换菜单视图
- (IBAction)toggleMenu:(id)sender
{
    // 需要知道,当前是否显示菜单视图
    _menuViewIsShow = !_menuViewIsShow;
    // 显示菜单,或者隐藏菜单,我们需要做的是,修改ActionViewController视图的位置
    
    CGSize size = self.view.bounds.size;
    CGPoint viewCenter;
    
    if (_menuViewIsShow) {
        // 显示菜单视图
        viewCenter = CGPointMake(size.width + 120., size.height / 2);
    } else {
        // 隐藏菜单视图
        viewCenter = CGPointMake(size.width / 2, size.height / 2);
    }
    
    [UIView animateWithDuration:0.2 animations:^{
        // 设置操作视图控制器视图的位置
        [_actionController.view setCenter:viewCenter];
    }];
}

#pragma mark - 菜单视图的代理方法
- (void)menuViewDidSelected:(NSString *)identifier
{
    // 根据传入的identifier,从storyboard中获取想要的视图控制器
    // 然后设置给操作视图控制器
    // 需要自己做优化,如果前一个视图跟当前视图控制器,是同一个,就不要有操作了
    self.actionController = [self.storyboard instantiateViewControllerWithIdentifier:identifier];
    
    // 需要调整一下视图的位置,让视图靠右
    CGSize size = self.view.bounds.size;
    CGPoint viewCenter = CGPointMake(size.width + 120, size.height / 2);
    
    [_actionController.view setCenter:viewCenter];
    
    [self toggleMenu:nil];
}

@end

 

iOS开发学习之多视图转换,,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。