首页 > 代码库 > segmentControl实现控制器的切换

segmentControl实现控制器的切换

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    //1 创建窗口    self.window = [[UIWindow alloc] init];    self.window.frame = [UIScreen mainScreen].bounds;    //2 设置主控制器    XCMainController *mainVc = [[XCMainController alloc] init];    UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:mainVc];    self.window.rootViewController = nav;    //3 显示window    [self.window makeKeyAndVisible];    return YES;}

 

 

第一个控制器初始化view:

- (void)viewDidLoad{    [super viewDidLoad];    self.view.backgroundColor = [UIColor purpleColor];    UILabel *label = [[UILabel alloc] init];    label.text = @"fristController";    label.font = [UIFont systemFontOfSize:17];    label.frame = CGRectMake(100, 100, 200, 100);    [self.view addSubview:label];}

 

第二个控制器初始化view:

- (void)viewDidLoad{    [super viewDidLoad];    self.view.backgroundColor = [UIColor greenColor];    UILabel *label = [[UILabel alloc] init];    label.text = @"secondController";    label.font = [UIFont systemFontOfSize:17];    label.frame = CGRectMake(100, 100, 200, 100);    [self.view addSubview:label];}

 

 

主控制器逻辑实现 
添加子控制器

- (void)viewDidLoad{    [super viewDidLoad];    self.navigationItem.titleView = [self setupSegment];    self.fristVc = [[XCFristController alloc] init];    self.fristVc.view.frame = CGRectMake(0, navigationHeight, mainVcWidth, mainVcHeight - 64);    [self addChildViewController:_fristVc];    self.secondVc = [[XCSecondController alloc] init];    self.secondVc.view.frame = CGRectMake(0, navigationHeight, mainVcWidth, mainVcHeight - 64);    [self addChildViewController:_secondVc];    //设置默认控制器为fristVc    self.currentVC = self.fristVc;    [self.view addSubview:self.fristVc.view];}

 

 

初始化UISegmentControl:

/** *  初始化segmentControl */- (UISegmentedControl *)setupSegment{    NSArray *items = @[@"1", @"2"];    UISegmentedControl *sgc = [[UISegmentedControl alloc] initWithItems:items];    //默认选中的位置    sgc.selectedSegmentIndex = 0;    //设置segment的文字    [sgc setTitle:@"oneView" forSegmentAtIndex:0];    [sgc setTitle:@"twoView" forSegmentAtIndex:1];    //监听点击    [sgc addTarget:self action:@selector(segmentChange:) forControlEvents:UIControlEventValueChanged];    return sgc;}

 

监听segmentControl点击事件:

- (void)segmentChange:(UISegmentedControl *)sgc{    //NSLog(@"%ld", sgc.selectedSegmentIndex);    switch (sgc.selectedSegmentIndex) {        case 0:            [self replaceFromOldViewController:self.secondVc toNewViewController:self.fristVc];            break;        case 1:            [self replaceFromOldViewController:self.fristVc toNewViewController:self.secondVc];            break;        default:            break;    }}

 

 

控制器切换

/** *  实现控制器的切换 * *  @param oldVc 当前控制器 *  @param newVc 要切换到的控制器 */- (void)replaceFromOldViewController:(UIViewController *)oldVc toNewViewController:(UIViewController *)newVc{    /**     *  transitionFromViewController:toViewController:duration:options:animations:completion:     *  fromViewController    当前显示在父视图控制器中的子视图控制器     *  toViewController        将要显示的姿势图控制器     *  duration                动画时间(这个属性,old friend 了 O(∩_∩)O)     *  options              动画效果(渐变,从下往上等等,具体查看API)UIViewAnimationOptionTransitionCrossDissolve     *  animations            转换过程中得动画     *  completion            转换完成     */    [self addChildViewController:newVc];    [self transitionFromViewController:oldVc toViewController:newVc duration:0.1 options:UIViewAnimationOptionTransitionCrossDissolve animations:nil completion:^(BOOL finished) {        if (finished) {            [newVc didMoveToParentViewController:self];            [oldVc willMoveToParentViewController:nil];            [oldVc removeFromParentViewController];            self.currentVC = newVc;        }else{            self.currentVC = oldVc;        }    }];}

segmentControl实现控制器的切换