Objective-C/UICatalog/AAPLSegmentedControlViewController.m

/*
 Copyright (C) 2015 Apple Inc. All Rights Reserved.
 See LICENSE.txt for this sample’s licensing information
 
 Abstract:
 A view controller that demonstrates how to use UISegmentedControl.
*/
 
#import "AAPLSegmentedControlViewController.h"
 
@interface AAPLSegmentedControlViewController()
 
@property (nonatomic, weak) IBOutlet UISegmentedControl *defaultSegmentedControl;
@property (nonatomic, weak) IBOutlet UISegmentedControl *tintedSegmentedControl;
@property (nonatomic, weak) IBOutlet UISegmentedControl *customSegmentsSegmentedControl;
@property (nonatomic, weak) IBOutlet UISegmentedControl *customBackgroundSegmentedControl;
 
@end
 
 
#pragma mark -
 
@implementation AAPLSegmentedControlViewController
 
- (void)viewDidLoad {
    [super viewDidLoad];
 
    [self configureDefaultSegmentedControl];
    [self configureTintedSegmentedControl];
    [self configureCustomSegmentsSegmentedControl];
    [self configureCustomBackgroundSegmentedControl];
}
 
 
#pragma mark - Configuration
 
- (void)configureDefaultSegmentedControl {
    self.defaultSegmentedControl.momentary = YES;
 
    [self.defaultSegmentedControl setEnabled:NO forSegmentAtIndex:0];
 
    [self.defaultSegmentedControl addTarget:self action:@selector(selectedSegmentDidChange:) forControlEvents:UIControlEventValueChanged];
}
 
- (void)configureTintedSegmentedControl {
    self.tintedSegmentedControl.tintColor = [UIColor aapl_applicationBlueColor];
 
    self.tintedSegmentedControl.selectedSegmentIndex = 1;
 
    [self.tintedSegmentedControl addTarget:self action:@selector(selectedSegmentDidChange:) forControlEvents:UIControlEventValueChanged];
}
 
- (void)configureCustomSegmentsSegmentedControl {
    NSDictionary *imageToAccesssibilityLabelMappings = @{
        @"checkmark_icon": NSLocalizedString(@"Done", nil),
        @"search_icon": NSLocalizedString(@"Search", nil),
        @"tools_icon": NSLocalizedString(@"Settings", nil)
    };
    
    // Guarantee that the segments show up in the same order.
    NSArray *sortedSegmentImageNames = [[imageToAccesssibilityLabelMappings allKeys] sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)];
 
    [sortedSegmentImageNames enumerateObjectsUsingBlock:^(NSString *segmentImageName, NSUInteger idx, BOOL *stop) {
        UIImage *image = [UIImage imageNamed:segmentImageName];
        
        image.accessibilityLabel = imageToAccesssibilityLabelMappings[segmentImageName];
        
        [self.customSegmentsSegmentedControl setImage:image forSegmentAtIndex:idx];
    }];
    
    self.customSegmentsSegmentedControl.selectedSegmentIndex = 0;
    
    [self.customSegmentsSegmentedControl addTarget:self action:@selector(selectedSegmentDidChange:) forControlEvents:UIControlEventValueChanged];
}
 
- (void)configureCustomBackgroundSegmentedControl {
    self.customBackgroundSegmentedControl.selectedSegmentIndex = 2;
    
    // Set the background images for each control state.
    UIImage *normalSegmentBackgroundImage = [UIImage imageNamed:@"stepper_and_segment_background"];
    [self.customBackgroundSegmentedControl setBackgroundImage:normalSegmentBackgroundImage forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
 
    UIImage *disabledSegmentBackgroundImage = [UIImage imageNamed:@"stepper_and_segment_background_disabled"];
    [self.customBackgroundSegmentedControl setBackgroundImage:disabledSegmentBackgroundImage forState:UIControlStateDisabled barMetrics:UIBarMetricsDefault];
 
    UIImage *highlightedSegmentBackgroundImage = [UIImage imageNamed:@"stepper_and_segment_background_highlighted"];
    [self.customBackgroundSegmentedControl setBackgroundImage:highlightedSegmentBackgroundImage forState:UIControlStateHighlighted barMetrics:UIBarMetricsDefault];
    
    // Set the divider image.
    UIImage *segmentDividerImage = [UIImage imageNamed:@"stepper_and_segment_segment_divider"];
    [self.customBackgroundSegmentedControl setDividerImage:segmentDividerImage forLeftSegmentState:UIControlStateNormal rightSegmentState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
 
    // Create a font to use for the attributed title (both normal and highlighted states).
    UIFontDescriptor *captionFontDescriptor = [UIFontDescriptor preferredFontDescriptorWithTextStyle:UIFontTextStyleCaption1];
    UIFont *font = [UIFont fontWithDescriptor:captionFontDescriptor size:0];
 
    NSDictionary *normalTextAttributes = @{
        NSForegroundColorAttributeName:[UIColor aapl_applicationPurpleColor],
        NSFontAttributeName:font
    };
    [self.customBackgroundSegmentedControl setTitleTextAttributes:normalTextAttributes forState:UIControlStateNormal];
 
    NSDictionary *highlightedTextAttributes = @{
        NSForegroundColorAttributeName:[UIColor aapl_applicationGreenColor],
        NSFontAttributeName:font
    };
    [self.customBackgroundSegmentedControl setTitleTextAttributes:highlightedTextAttributes forState:UIControlStateHighlighted];
    
    [self.customBackgroundSegmentedControl addTarget:self action:@selector(selectedSegmentDidChange:) forControlEvents:UIControlEventValueChanged];
}
 
 
#pragma mark - Actions
 
- (void)selectedSegmentDidChange:(UISegmentedControl *)segmentedControl {
    NSLog(@"The selected segment changed for: %@.", segmentedControl);
}
 
@end