Skip to content

Instantly share code, notes, and snippets.

@koenvanderdrift
Created February 25, 2017 15:13
Show Gist options
  • Save koenvanderdrift/f526814b1dd6fda972c5ebd2bb1e1209 to your computer and use it in GitHub Desktop.
Save koenvanderdrift/f526814b1dd6fda972c5ebd2bb1e1209 to your computer and use it in GitHub Desktop.
SegmentedViewController
//
// 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