iOS: Skinning der UISegmentedControl-Komponente

Dieser Blogeintrag befasst sich mit dem Skinning der UISegmentedControl-Komponente, was sich mit iOS 5 nun einfacher gestaltet. So sieht die Komponente in ihren normalen Zustand aus:

default look
Seit iOS 5 werden die Methoden setBackgroundImage: forState: barMetrics: und setDividerImage: forLeftSegmentState: rightSegmentState: barMetrics: bereitgestellt, mit denen das Aussehen der Komponente im Handumdrehen verändert werden kann.

skinned UISegmentedControl
Der verwendete Code für die obrige Darstellung sieht folgendermaßen aus:

    // navigation is an UISegmentedControl
    // BACKGROUND
    // unselected
    UIImage *unselected = [[UIImage imageNamed:@"unselected.png"]
                           resizableImageWithCapInsets:UIEdgeInsetsMake(0, 15, 0, 15)];
    [[self navigation] setBackgroundImage:unselected
                                           forState:UIControlStateNormal
                                         barMetrics:UIBarMetricsDefault];

    // selected
    UIImage *selected = [[UIImage imageNamed:@"selected.png"]
                         resizableImageWithCapInsets:UIEdgeInsetsMake(0, 15, 0, 15)];
    [[self navigation] setBackgroundImage:selected
                                           forState:UIControlStateSelected
                                         barMetrics:UIBarMetricsDefault];

    // DIVIDER
    // unselected/unselected
    UIImage *unselectedUnselected = [UIImage imageNamed:@"unselected_unselected.png"];
    [[self navigation] setDividerImage:unselectedUnselected
                             forLeftSegmentState:UIControlStateNormal
                               rightSegmentState:UIControlStateNormal
                                      barMetrics:UIBarMetricsDefault];

    // selected/unselected
    UIImage *selectedUnselected = [UIImage imageNamed:@"selected_unselected.png"];
    [[self navigation] setDividerImage:selectedUnselected
                             forLeftSegmentState:UIControlStateSelected
                               rightSegmentState:UIControlStateNormal
                                      barMetrics:UIBarMetricsDefault];

    // unselected/selected
    UIImage *unselectedSelected = [UIImage imageNamed:@"unselected_selected.png"];
    [[self navigation] setDividerImage:unselectedSelected
                             forLeftSegmentState:UIControlStateNormal
                               rightSegmentState:UIControlStateSelected
                                      barMetrics:UIBarMetricsDefault];

Die Eigenschaften des Labels können mit der Methode setTitleTextAttributes: forState: verändert werden.

   // navigation is an UISegmentedControl
   // STATE NORMAL
    [navigation setTitleTextAttributes:
     [NSDictionary dictionaryWithObjectsAndKeys:
      [UIColor colorWithRed:1.0 green:1.0 blue:1.0 alpha:1.0],
      UITextAttributeTextColor,
      [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.8],
      UITextAttributeTextShadowColor,
      [NSValue valueWithUIOffset:UIOffsetMake(0, -1)],
      UITextAttributeTextShadowOffset,
      nil] forState:UIControlStateNormal];

    // STATE SELECTED
    [navigation setTitleTextAttributes:
     [NSDictionary dictionaryWithObjectsAndKeys:
      [UIColor colorWithRed:1.0 green:0.0 blue:0.0 alpha:1.0],
      UITextAttributeTextColor,
      [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.8],
      UITextAttributeTextShadowColor,
      [NSValue valueWithUIOffset:UIOffsetMake(0, -1)],
      UITextAttributeTextShadowOffset,
      nil] forState:UIControlStateSelected];

Das hier verwendete Beispiel verändert die Farbe der Labels für den normalen und selektierten Zustand.

skinned UISegmentedControl
Die verwendeten Grafiken für die Segmente selber sind nicht auf die Buttonform beschränkt. Hier ein Beispiel, in dem die Segmente eher an Tabs erinnern:

skinned UISegmentedControl

Das komplette Beispiel mit allen Grafiken und dem Code könnte ihr hier als Xcode-Projekt herunterladen.

This entry was posted in Objective-C, iPhone and tagged , , , , . Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>