2010-01-11 8 views
2

Est-il possible d'avoir un UISegmentedControl span deux lignes sur l'iPhone? J'ai vu cela dans quelques applications, mais je n'ai pas trouvé ce dont j'avais besoin dans la documentation. Peut-être que c'est un UIButton personnalisé conçu pour ressembler à UISegmentedControl.Deux lignes UISegmentedControl

Répondre

0

Il n'est pas possible d'utiliser le standard UISegmentedControl - vous devrez le dessiner seul.

1

Je cherchais aussi cela. Je voulais même que la deuxième rangée ressemble à une partie de la première, plutôt à une grille. Impossible de trouver un second UISegmentedControl et de le combiner avec un autre astuce pour prendre en charge les arêtes arrondies inutiles.


Dans ma mise en œuvre inherit de UIControl (hérite de UIView), Ajouté 2 UISegmentControls, 2 UIViews rogner les bords et les faire regarder comme un.

Ensuite, je fais quelques ajustements pour redéfinir visuellement les champs de texte au centre.

Facilement déployé horizontalement, et avec un effort minime, une troisième rangée ... pourrait également être ajoutée.

L'en-tête:

// YHSegmentedGridControl.h 
#import <UIKit/UIKit.h> 

@interface YHSegmentedGridControl : UIControl{ 
    UISegmentedControl *a,*b; 
    UIView *va,*vb; 
} 

- (void)setSelectedSegmentIndex:(NSInteger)index; 
- (NSInteger)selectedSegmentIndex; 

@end 

Dans le fichier .m:

// YHSegmentedGridControl.m 
// UITestSegment2D 
// Created by Yh on 22/04/13. 

#import "YHSegmentedGridControl.h" 

@implementation YHSegmentedGridControl 

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
     // Initialization code 

     [self initWithDefaults]; 
    } 
    return self; 
} 

Le travail réel:

-(void) initWithDefaults{ 
    a = [[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObjects: @"1", @"2", nil]]; 
    b = [[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObjects: @"3", @"4", nil]]; 

    float e = 75; 
    int d = (int)e/7; 

    [a setFrame:CGRectMake(0, 0, 2*e, e+2*d)]; 
    [b setFrame:CGRectMake(0, -2*d, 2*e, e+2*d)]; 

    [a setContentOffset:CGSizeMake(0, -d) forSegmentAtIndex:0]; 
    [a setContentOffset:CGSizeMake(0, -d) forSegmentAtIndex:1]; 
    [b setContentOffset:CGSizeMake(0, +d) forSegmentAtIndex:0]; 
    [b setContentOffset:CGSizeMake(0, +d) forSegmentAtIndex:1]; 

    [a addTarget:self 
      action:@selector(pickOne:) 
forControlEvents:UIControlEventValueChanged]; 
    [b addTarget:self 
      action:@selector(pickOne:) 
forControlEvents:UIControlEventValueChanged]; 

    va = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 2*e, e)]; 
    vb = [[UIView alloc] initWithFrame:CGRectMake(0, e, 2*e, e)]; 

    [va setClipsToBounds:YES]; 
    [vb setClipsToBounds:YES]; 

    [self setFrame:CGRectMake(0,0,2*e,2*e)]; 

    [va addSubview:a]; 
    [vb addSubview:b]; 

    [self addSubview:va]; 
    [self addSubview:vb]; 
} 

- (void)setSelectedSegmentIndex:(NSInteger)index{ 
    if(index == UISegmentedControlNoSegment){ 
     [a setSelectedSegmentIndex:UISegmentedControlNoSegment]; 
     [b setSelectedSegmentIndex:UISegmentedControlNoSegment]; 
    } else if(index < a.numberOfSegments){ 
     [a setSelectedSegmentIndex:index]; 
     [b setSelectedSegmentIndex:UISegmentedControlNoSegment]; 
    } else if(index < (a.numberOfSegments + b.numberOfSegments)){ 
     [b setSelectedSegmentIndex:(index - a.numberOfSegments)]; 
     [a setSelectedSegmentIndex:UISegmentedControlNoSegment]; 
    }else 
     NSLog(@"No such segment: index to high"); 
} 


- (NSInteger)selectedSegmentIndex{ 
    if(a.selectedSegmentIndex != UISegmentedControlNoSegment) 
     return a.selectedSegmentIndex; 
    else if(b.selectedSegmentIndex != UISegmentedControlNoSegment) 
     return b.selectedSegmentIndex + a.numberOfSegments; 
    else 
     return UISegmentedControlNoSegment; 
    return 0; 
} 

- (void)pickOne:(id)sender{ 
    if(sender == a) 
     [b setSelectedSegmentIndex:UISegmentedControlNoSegment]; 
    if(sender == b) 
     [a setSelectedSegmentIndex:UISegmentedControlNoSegment]; 
    //notify 
    [self sendActionsForControlEvents:UIControlEventValueChanged]; 
} 

@end