In iOS-Apps werden Daten immer wieder in tabellarischer Form angezeigt, wozu gerne die UITableView genutzt wird. Um dem Anwender klar zu machen, dass sich hinter einem Eintrag noch mehr Infos verbergen, wird ein Accessory View genutzt. Dieser Disclosure Indicator View kann unterschiedliche Symbole beinhalten, wie folgt :

  • Detail (runder Kreis mit einem i)
  • Checkmark (ein Haken)
  • Detail Disclosure (ein runder Kreis mit einem i und ein Pfeil nach rechts)
  • Disclosure Indicator (nur ein Pfeil nach rechts)

Der Disclosure Indicator hat eine Standardfarbe, die von Xcode vorgegeben wird. Diese Farbe ist aber nicht immer passend, womit der Pfeil nicht mehr sichtbar ist. Um den Pfeil dem Design anzupassen, gibt es zwei Möglichkeiten.

1. Möglichkeit

Für den View wird jeweils ein Bild hinterlegt, welches zum Design passend ist. Dieses Bild kann über die folgende Zeile aufgerufen und angezeigt werden :

  1. cell.accessoryView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"accessory.png"]];

Anstatt des Standardpfeils wird nun das angegebene Bild accessory.png angezeigt. Nachteil dieser Variante, es muss für jede neue Farbe ein eigenes Bild mit in der App hinterlegt werden. Dieses ist nicht sehr schonend für die Ressourcen und auch sehr unübersichtlich.

2. Möglichkeit

Nun zeige ich Ihnen, wie Sie den View selber zeichnen können in unterschiedlichen Farben. Dazu erstellen Sie einfach die beiden folgenden Dateien :
DisclosureIndicator.h

  1. #import <UIKit/UIKit.h>;
  2. #import <Foundation/Foundation.h>;
  3.  
  4. @interface DisclosureIndicator : UIView
  5.  
  6. @property(nonatomic, strong) UIColor *color;
  7.  
  8. - (DisclosureIndicator *)initWithColor:(UIColor *)color;
  9.  
  10. @end

DisclosureIndicator.m

  1. #import "DisclosureIndicator.h"
  2.  
  3. @interface DisclosureIndicator ()
  4.  
  5. @property(nonatomic) CGFloat red;
  6. @property(nonatomic) CGFloat green;
  7. @property(nonatomic) CGFloat blue;
  8. @property(nonatomic) CGFloat alpha;
  9.  
  10. @end
  11.  
  12. @implementation DisclosureIndicator
  13.  
  14. - (void)drawRect:(CGRect)rect {
  15.     CGContextRef context = UIGraphicsGetCurrentContext();
  16.     CGContextSetRGBFillColor(context, self.red, self.green, self.blue, self.alpha);
  17.  
  18.     CGContextMoveToPoint(context, 6, 3);
  19.     CGContextAddLineToPoint(context, 6, 3);
  20.     CGContextAddLineToPoint(context, 16, 12);
  21.     CGContextAddLineToPoint(context, 6, 21);
  22.     CGContextAddLineToPoint(context, 4, 19);
  23.     CGContextAddLineToPoint(context, 12, 12);
  24.     CGContextAddLineToPoint(context, 4, 5);
  25.     CGContextAddLineToPoint(context, 6, 3);
  26.     CGContextFillPath(context);
  27. }
  28.  
  29. - (DisclosureIndicator *)initWithColor:(UIColor *)color {
  30.     self = [super initWithFrame:CGRectMake(0, 0, 16, 24)];
  31.     self.backgroundColor = [UIColor clearColor];
  32.  
  33.     self.color = color;
  34.     [self setNeedsDisplay];
  35.  
  36.     return self;
  37. }
  38.  
  39. - (void)setColor:(UIColor *)color {
  40.     _color = color;
  41.  
  42.     [self.color getRed:&_red green:&_green blue:&_blue alpha:&_alpha];
  43.  
  44.     [self setNeedsDisplay];
  45. }
  46. @end

Mit dieser kleinen Klasse wird der neue Disclosure Indicator gezeichnet. Dieses passiert in der Funktion drawRect. Über den Befehl CGContextAddLineToPoint wird der Pfeil über die Angaben der X und Y Koordinaten entsprechend gezeichnet. Mit der Funktion initWithColor, wird die View erzeugt und die Farbe für den Pfeil übergeben. Der Aufruf um einen Pfeil entsprechend zu zeichnen erfolgt in der UITableView Delegate Methode cellForRowAtIndexPath :

Aufruf zum Zeichnen des Disclosure Indicator

  1. UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cellIdentifier" forIndexPath:indexPath];
  2. [cell setAccessoryView:[[V_DisclosureIndicator alloc] initWithColor:[UIColor redColor]]];

Damit können Sie nun in jeder UITableViewCell einen Disclosure Indicator in jeder passenden Farbe zu Ihrem Design zeichnen. Hier ein Beispiel :

Das Bild des Disclosure Indicator entspricht dem obenstehenden Beispiel :Disclosure Indicator.

Wenn Sie noch andere Ideen haben oder Ihnen der Beitrag gefallen hat, freue ich mich über ein Kommentar.