2010-08-09 6 views
3

L'UIPicker apparaît-il du bas de l'écran lorsqu'une action est appelée simplement UIPickerView de base coordonnée d'une certaine manière? (Comme une UIActionSheet?) Comment pourrais-je l'implémenter?Fenêtre contextuelle inférieure UIPicker?

+0

J'ai créé un petit exemple. Lien ajouté à mon message – kovpas

Répondre

4

est ici le code d'animation, que j'utilise:

- (void)animateDatePicker:(BOOL)show { 
    CGRect screenRect = self.frame; 
    CGSize pickerSize = [self.datePickerView sizeThatFits:CGSizeZero]; 
    CGRect startRect = CGRectMake(0.0, 
            screenRect.origin.y + screenRect.size.height, 
            pickerSize.width, pickerSize.height); 

    CGRect pickerRect = CGRectMake(0.0, 
            screenRect.origin.y + screenRect.size.height - pickerSize.height, 
            pickerSize.width, 
            pickerSize.height); 

    self.datePickerView.frame = pickerRect; 
    self.backgroundColor = UIColorMakeRGBA(64, 64, 64, 0.7f - (int)show * 0.7f); 

    if (show) { 
     self.datePickerView.frame = startRect; 
     [self.parentViewController addSubviewToWindow:self]; 
    } 

    [UIView beginAnimations:nil context:nil]; 
    [UIView setAnimationDuration:0.3f]; 
    [UIView setAnimationDelegate:self]; 

    self.backgroundColor = UIColorMakeRGBA(64, 64, 64, 0.0f + (int)show * 0.7f); 

    if (show) { 
     self.datePickerView.frame = pickerRect; 
    } else { 
     [UIView setAnimationDidStopSelector:@selector(slideDownDidStop)]; 
     self.datePickerView.frame = startRect; 
    } 

    [UIView commitAnimations]; 
} 

datePickerView est une vue, qui contient DatePicker:

self.datePickerView = [[UIView alloc] initWithFrame:CGRectMake(0.0, 174.0, 320.0, 286.0)]; 
self.datePicker = [[UIDatePicker alloc] initWithFrame:CGRectMake(0.0, 70.0, 320.0, 216.0)]; 
[self.datePicker setDatePickerMode:UIDatePickerModeDate]; 
[self.datePicker addTarget:self action:@selector(pickerValueChanged:) forControlEvents:UIControlEventValueChanged]; 
[self.datePickerView addSubview:self.datePicker]; 

parentViewController devrait implémenter la méthode addSubviewToWindow:

- (void)addSubviewToWindow:(UIView *)addView { 
    [self.view addSubview:addView]; 
} 

UIColorMakeRGBA:

SlideDownDidStop est une méthode qui sera appelée après le démontage réussi de datePicker.
#define UIColorMakeRGBA(nRed, nGreen, nBlue, nAlpha) [UIColor colorWithRed:(nRed)/255.0f green:(nGreen)/255.0f blue:(nBlue)/255.0f alpha:nAlpha] 

Donc, pour résumer - vous avez MyViewController, qui ont

MyDatePickerView *myDatePicker; 
champ

.

MyDatePickerView est une classe personnalisée qui possède le champ UIDatePicker * datePicker, MyViewController * parentViewController et la méthode animateDatePicker.

Lorsque vous effectuez une action sur MyViewController (par exemple, UIControlEventTouchUpInside appuyer sur un bouton), vous devez appeler

[myDatePicker animateDatePicker:YES]; 

S'il vous plaît laissez-moi savoir si vous avez des questions.

MISE À JOUR: Voici un petit example.

+0

Wow, merci pour le code - cela a dû être beaucoup de travail. Malheureusement, je ne comprends pas très bien comment l'implémenter. J'ai créé une application de vue de base et ajouté un autre UIViewController appelé MyDatePickerView. Je suppose que c'est censé être appelé depuis la vue principale. J'ai copié tout le code ci-dessus et déclaré la méthode dans cette vue, mais je ne suis pas sûr de savoir comment mettre en œuvre le reste. – startuprob

0

Mettez un UIPickerView dans une nouvelle classe UIViewController (appelons-le PopupUIPicker) puis afficher que View Controller via:

PopupUIPicker *pickerController = [[[PopupUIPicker alloc] init] autorelease]; 
[currentViewController presentModalViewController:pickerController animated:YES]; 

Où currentViewController est le View Controller vous souhaitez afficher sur. Pour le supprimer:

[currentViewController dismissModalViewControllerAnimated:YES]; 

L'animation par défaut est de glisser vers le haut depuis le bas. Vous pouvez le changer comme:

pickerController.modalTransitionStyle = UIModalTransitionStylePartialCurl; 
+0

Ceci ajoute une nouvelle vue entière. Ce que j'essaie de faire, c'est de faire apparaître l'uiPicker dans la moitié inférieure de l'écran. (La même chose se produit lorsque quelqu'un clique sur le bouton "flux en direct" dans le coin supérieur droit de l'application facebook.) Un petit UIPicker apparaît mais ne couvre pas toute la page. – startuprob

+0

Vous n'avez pas besoin de faire en sorte que la vue occupe toute la vue. –

0

Que voulez-vous dire par « la UIPicker qui apparaît à partir du bas de l'écran lorsqu'une action est appelée »?

Si vous voulez faire à peu près ce que l'application Facebook fait, cherchez Three20 qui est leur bibliothèque d'interface utilisateur open-source (pas de garantie que le composant qu'ils utilisent est là, je n'ai pas vérifié).

+0

Normalement, un UIPickerView occupe environ la moitié de l'écran - en fonction de l'endroit où le développeur le met. L'application Facebook a l'UIPickerView venir du bas (Tout comme une UIActionSheet), mais il ne couvre pas tout l'écran. – startuprob

0

J'ai le même problème que Rob ... Je peux faire le popup UIPicker ... mais il remplit tout l'écran ... je veux juste le sélecteur de popup ... Matt dit que vous n'avez pas pour faire en sorte que la vue prenne toute la trame ... le redimensionnement de la vue ne marche pas ... Comment faites-vous juste apparaître le sélecteur? Je devais encore voir la partie de la vue des parents ... un peu comme Safari sur iPhone gère les listes déroulantes.