2009-12-12 6 views
8

Je l'ai seulement vu dans un très peu d'applications iPhone ... mais il ressemble à un sélecteur qui tourne à gauche/droite (au lieu de haut/bas).Un ipipick aperçu iphone qui tourne horizontalement?

Ils le placent généralement sur 1 ligne d'une tableView ... pour permettre à l'utilisateur de choisir rapidement entre un petit nombre de choix (par exemple 3-10).

Comment cela est-il codé?

+0

Voici à quoi devrait ressembler le sélecteur: http://images.macworld.com/images/reviews/graphics/143531-dr_dof_original.jpg – Donna

Répondre

-12

Avez-vous déjà envisagé de prendre une vue de table et de la faire pivoter?

Je ne pense pas. Va essayer ça. :)

+0

Je ne voudrais probablement pas faire pivoter toute la vue de la table. (Et avoir les "lignes" allant de haut en bas sur l'écran.) Mais ... peut-être que les développeurs tournent le sélecteur ... et certains comment le redimensionner pour tenir dans 1 ligne de la table- vue. Mais à quoi ressemblerait le code? – Donna

+0

Pourquoi n'essayez-vous pas de l'écrire et de le découvrir par vous-même? C'est la seule façon d'apprendre quoi que ce soit. – Sneakyness

+0

Je vous suggère fortement de lire toute la documentation d'Apple sur http://developer.apple.com dans la section iPhone sur le démarrage, à la fois avec la programmation iPhone et Objective-C. – Sneakyness

0

Essayez une scrollview paginée contenant les éléments souhaités sur une par page, et peut-être superposer une image au-dessus si vous voulez de meilleurs graphismes pour votre contrôle, et ne permettre que le défilement horizontal (ne faites pas le contentSize de la scrollview plus grande que la taille de la vue réelle, et désactiver le défilement vertical du scroll sur le contrôle).

3

Vous pouvez le faire en prenant un UIPickerView régulier, en ajustant sa largeur (via setFrame:), puis en appliquant un NSAffineTransform pour le faire pivoter à 90º. Vous devrez ensuite faire pivoter chaque élément dans le sélecteur de 90 ° dans l'autre sens.

C'est un peu fastidieux de le faire correctement, mais cela peut être fait.

+0

Les lettres ne vont-elles pas tourner de 90 degrés? Je pense que c'est une vue personnalisée sur la capture d'écran. –

+0

@Alex oui, c'est pourquoi vous devez faire pivoter chaque 'viewForRow: forComponent: réutilingView:' de 90º dans l'autre sens. –

6

Poursuivant la réponse par Dave DeLong je l'ai eu à travailler comme ça ......

Dans viewDidLoad Je l'ai fait ...

CGRect frame = horizontalPickerView.frame; 
     frame.size.width = 50; 
     frame.size.height = 216; 
     frame.origin.x=90; 
     frame.origin.y = 200; 
     horizontalPickerView.frame = frame; 

     horizontalPickerView.transform = CGAffineTransformMakeRotation(3.14159/2); 






- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view{ 
     UILabel *lbl = [[[UILabel alloc] initWithFrame:CGRectMake(0, 0, 30, 20)] autorelease]; 
     lbl.transform = CGAffineTransformMakeRotation(-3.14159/2); 
     lbl.text = @"hi"; 
     return lbl; 
    } 

Hope this helps

+1

Pour CGAffineTransform n'oubliez pas d'ajouter QuartzCore Framework à votre projet –

+0

pouvez-vous expliquer le 3.14159/2? (Je connais son PI, mais pourquoi est-il ici et pourquoi le/2)? –

+1

Je l'ai fait de sorte que le sélecteur est tourné de 90 degrés d'où il va défiler horizontalement et 3.14159/2 est la valeur de 90 degrés de radiance –

0

Essayez cette -> Créez un UIV de taille simple de la taille de l'aperçu UIP, ajoutez un sélecteur. définir numberOfComponentsInPickerView = 1. définir la largeur du composant. Ajoutez ensuite de petites vues secondaires pour masquer le reste du sélecteur. Seule la roue en rotation du composant doit être visible. Transformez la vue en plan pour la faire pivoter de 90 degrés.

Assurez-vous d'appliquer Tranform dans:

-(UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view 

{ 

    UILabel *lbl = nil; 
    if(view) 
    { 
     lbl = (UILabel *) [view viewWithTag:11]; 
    } 
    else 
    { 
     view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 32, 32)]; 
     lbl = [[UILabel alloc] initWithFrame:CGRectMake(1, 0, 30, 30)]; 
     lbl.tag = 11; 
     lbl.backgroundColor = [UIColor clearColor]; 
     lbl.textAlignment = UITextAlignmentCenter; 
     lbl.font = [UIFont fontWithName:@"Helvetica-Bold" size:18]; 
     lbl.transform = CGAffineTransformRotate(lbl.transform, M_PI +M_PI/2); 
     [view addSubview:lbl]; 
     [lbl release]; 
    } 


    lbl.text = [dataSourceArray objectAtIndex:row]; 


    return view; 
} 

Vous pouvez maintenant ajouter vue palin comme pour sélecteur horizontal sous-vue, en tout état.

0

Vous devrez créer un sélecteur de programme, de sorte que vous puissiez créer votre propre sélecteur de taille avec CGRectMake(x, y, width, height) puis, vous devrez le faire pivoter, mais en le tournant également dans les méthodes dataSources du sélecteur, vous devrez faire pivoter le vue inverse de la rotation de sélecteur, je compris le code hopfully il aidera

..... 
... 
... 
NSArray *arr = [NSArray arrayWithObjects:@"1 mi", @"2 mi", @"5 mi", @"10 mi", @"15 mi", @"20 mi", @"25 mi", 
       @"30 mi", @"35 mi", @"40 mi", @"45 mi", @"50 mi", @"75 mi", @"99 mi", nil]; 

    radiusDefaults = [[NSMutableArray alloc] initWithArray:arr] ; 

    radiusPicker = [[UIPickerView alloc] initWithFrame:CGRectMake(0, 0, 100, 150)]; 
    radiusPicker.delegate = self; 
    radiusPicker.dataSource = self; 
    radiusPicker.showsSelectionIndicator = NO; 

    //Resize the picker, rotate it so that it is horizontal and set its position 
    CGAffineTransform rotate = CGAffineTransformMakeRotation(-1.57); 
    rotate = CGAffineTransformScale(rotate, .1, .5); 
    CGAffineTransform t0 = CGAffineTransformMakeTranslation(-61, 0); 
    radiusPicker.transform = CGAffineTransformConcat(rotate,t0); 

// [theNavigationBar.topItem setTitleView:radiusPicker] ; 
    UIView *pickerWrapper = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 215)]; 
    [self.view addSubview:radiusPicker]; 
    [radiusPicker selectRow:6 inComponent:0 animated:NO]; 
    [radiusPicker release]; 

..... 
....... 
.... 

    #pragma mark - 
    #pragma mark UIPickerView 
    - (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row 
       forComponent:(NSInteger)component reusingView:(UIView *)view{ 


     UIView *viewForRow = [[[UIView alloc] initWithFrame:CGRectMake(0, 0, 70, 400)] autorelease]; 

     UILabel *label; 

     UIFont *font = [ UIFont fontWithName:@"ArialRoundedMTBold" size:22]; 


     label = [[[UILabel alloc] initWithFrame:CGRectMake(0, 20, 70, 350)] autorelease]; 

     [label setText:[NSString stringWithFormat:@"%@", [radiusDefaults objectAtIndex:row]]]; 
     label.textAlignment = UITextAlignmentCenter; 
     label.textColor = [UIColor blueColor]; 
     label.font = font; 
     label.backgroundColor = [UIColor clearColor]; 
     // label.opaque = NO; 
     [viewForRow addSubview:label]; 

     CGAffineTransform rotate = CGAffineTransformMakeRotation(1.57); 
     rotate = CGAffineTransformScale(rotate, 1, 6.5); 
     [viewForRow setTransform:rotate]; 
     return viewForRow; 
    } 
1

@ code de Madhup me conduisent dans la direction générale que je voulais quand je cherchais le UIPickerView horizontal, mais je compris alors la question posée était pas vraiment adressé ainsi pour n'importe qui qui cherchait une réponse plus appropriée à la rotation de gauche à droite. Le code dans les réponses que j'avais lues était tout pour permettre le balayage de gauche à droite, amenant le sélecteur à pousser les étiquettes/lignes avec des valeurs plus élevées à gauche de la vue.Toutes les façons voici ma contribution:

Dans la méthode viewDidLoad:

yourPickerView.frame = frame; 
    yourPickerView.transform = CGAffineTransformMakeRotation(4.71238898); //Instead of rotating clockwise 90° we're rotating 90° counterclockwise. 4.71238898 being ≈270° in radians. 
    [self.view addSubview:self.picker]; 
    self.yourPickerView.delegate = self; 
    self.yourPickerView.dataSource = self; 
    self.yourPickerView.showsSelectionIndicator = YES; 
    self.yourPickerView.userInteractionEnabled = YES; 

La méthode de pickerView:

-(UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view{ 
     UILabel *label = [[[UILabel alloc] initWithFrame:CGRectMake(0, 0, 20, 20)] autorelease]; 
    yourLabel.transform = CGAffineTransformMakeRotation(1.57079633); //Instead of rotating counterclockwise 90° we're rotating 90° clockwise 1.57079633 being ≈90° in radians. 
    yourLabel.font = [UIFont fontWithName:@"System-Bold" size:18]; //Your font here. 
    yourLabel.text = @"yourLabel's text"; //or like me [NSString stringWithFormat:@"%@, [yourArray objectAtIndex:row]] 
    yourLabel.backgroundColor = [UIColor clearColor]; 
    return label; 
    } 
6

Here vous trouverez le code source pour Picker qui est aligné horizontalement.

+0

Impossible de faire défiler horizontalement. Vous devez appuyer sur chaque cellule pour faire défiler. – chicobermuda