Created
February 25, 2017 15:13
-
-
Save koenvanderdrift/f526814b1dd6fda972c5ebd2bb1e1209 to your computer and use it in GitHub Desktop.
SegmentedViewController
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// | |
// SegmentedViewController.m | |
// ViewControllerTest | |
// | |
// Created by Koen van der Drift on 2/25/17. | |
// Copyright © 2017 Koen van der Drift. All rights reserved. | |
// | |
#import "SegmentedViewController.h" | |
#import "RedViewController.h" | |
#import "TableViewController.h" | |
@interface SegmentedViewController () | |
@property (nonatomic, strong) UISegmentedControl *segmentedControl; | |
@property (nonatomic, strong) UIToolbar *toolbar; | |
@property (nonatomic, strong) UIViewController *currentVC; | |
@end | |
@implementation SegmentedViewController | |
- (void)viewDidLoad | |
{ | |
[super viewDidLoad]; | |
self.view.backgroundColor = [UIColor whiteColor]; | |
self.navigationController.navigationBar.translucent = YES; | |
self.title = @"Segmented Control Test"; | |
[self setUpViewControllers]; | |
if (self.viewControllers.count) | |
{ | |
self.segmentedControl = [[UISegmentedControl alloc] initWithItems: self.segmentTitles]; | |
[self.segmentedControl addTarget: self | |
action: @selector(segmentClicked:) | |
forControlEvents: UIControlEventValueChanged]; | |
self.segmentedControl.apportionsSegmentWidthsByContent = YES; | |
self.toolbar = [[UIToolbar alloc] init]; | |
self.toolbar.translucent = YES; | |
self.toolbar.delegate = self; | |
self.toolbar.clipsToBounds = YES; | |
UIBarButtonItem *segmentedControlButtonItem = [[UIBarButtonItem alloc] initWithCustomView: self.segmentedControl]; | |
UIBarButtonItem *flexibleItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem: UIBarButtonSystemItemFlexibleSpace | |
target: nil | |
action: nil]; | |
[self.toolbar setItems: @[flexibleItem, segmentedControlButtonItem, flexibleItem] animated: YES]; | |
[self.navigationController.view addSubview: self.toolbar]; | |
self.segmentedControl.selectedSegmentIndex = 0; | |
} | |
if (!self.currentVC) | |
{ | |
// set the first child vc | |
UIViewController *vc = self.viewControllers.firstObject; | |
[self addChildViewController: vc]; | |
vc.view.frame = [self frameForChildView]; | |
[self.view addSubview: vc.view]; | |
[vc didMoveToParentViewController: self]; | |
self.currentVC = vc; | |
} | |
} | |
- (void) viewDidLayoutSubviews | |
{ | |
[super viewDidLayoutSubviews]; | |
self.toolbar.frame = CGRectMake(0, self.topLayoutGuide.length, CGRectGetWidth(self.view.bounds), 44.0f); | |
self.currentVC.view.frame = [self frameForChildView]; | |
} | |
- (void) setUpViewControllers | |
{ | |
RedViewController *rvc = [[RedViewController alloc] init]; | |
TableViewController *tvc = [[TableViewController alloc] init]; | |
self.viewControllers = @[tvc, rvc]; | |
self.segmentTitles = @[@"Table", @"Red"]; | |
} | |
- (void)segmentClicked:(id)sender | |
{ | |
if (sender == self.segmentedControl) | |
{ | |
NSUInteger index = self.segmentedControl.selectedSegmentIndex; | |
[self selectViewControllerAtIndex: index]; | |
} | |
} | |
- (void) selectViewControllerAtIndex: (NSUInteger) index | |
{ | |
[self loadViewController: self.viewControllers[index]]; | |
if (self.segmentedControl.selectedSegmentIndex != index) | |
self.segmentedControl.selectedSegmentIndex = index; | |
} | |
- (void)loadViewController:(UIViewController *)vc | |
{ | |
if (self.currentVC == vc) | |
return; | |
[self addChildViewController: vc]; | |
[self.currentVC willMoveToParentViewController: nil]; | |
[self transitionFromViewController: self.currentVC | |
toViewController: vc | |
duration: 0 | |
options: UIViewAnimationOptionLayoutSubviews | |
animations: ^{ | |
vc.view.frame = [self frameForChildView]; | |
[self.view addSubview: vc.view]; | |
} completion:^(BOOL finished) { | |
[vc didMoveToParentViewController: self]; | |
[self.currentVC removeFromParentViewController]; | |
self.currentVC = vc; | |
} | |
]; | |
} | |
- (CGRect) frameForChildView | |
{ | |
CGRect frame = CGRectMake(0, 0, CGRectGetWidth(self.view.bounds), CGRectGetHeight(self.view.bounds)); | |
frame.origin.y += 44.0f; | |
frame.size.height -= self.bottomLayoutGuide.length; | |
return frame; | |
} | |
@end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment