2009-07-28 11 views
6

Quelqu'un a posté ce code dans une autre question de mettre un UIDatePicker dans un UIAlertSheet:UIDatePicker dans UIActionSheet problème superposant

UIActionSheet *menu = [[UIActionSheet alloc] initWithTitle:@"Date Picker" 
                delegate:self 
             cancelButtonTitle:@"Cancel" 
            destructiveButtonTitle:nil 
             otherButtonTitles:nil]; 

// Add the picker 
UIDatePicker *pickerView = [[UIDatePicker alloc] init]; 
pickerView.datePickerMode = UIDatePickerModeDate; 
[menu addSubview:pickerView]; 
[menu showInView:self.view];   
[menu setBounds:CGRectMake(0,0,320, 500)]; 

CGRect pickerRect = pickerView.bounds; 
pickerRect.origin.y = -100; 
pickerView.bounds = pickerRect; 

[pickerView release]; 
[menu release]; 

J'ai modifié à ceci:

UIActionSheet *menu = [[UIActionSheet alloc] initWithTitle:nil 
                 delegate:nil 
              cancelButtonTitle:@"Done" 
             destructiveButtonTitle:nil 
              otherButtonTitles:nil]; 

    // Add the picker 
    UIDatePicker *pickerView = [[UIDatePicker alloc] init]; 
    pickerView.datePickerMode = UIDatePickerModeCountDownTimer; 
    [menu addSubview:pickerView]; 
    [menu showInView:self.navigationController.tabBarController.view];   
    [menu setBounds:CGRectMake(0,0,320, 516)]; 
    [pickerView setFrame:CGRectMake(0, 85, 320, 216)]; 

Cela donne correctement une feuille d'alerte positionné (ignorer le délégué nil, ceci est juste à des fins d'affichage). Le problème est ici:

alt text http://hosting-wizards.com/actionsheet.jpg

Comme vous pouvez le voir, au-dessus de la barre de défilement de minutes, il y a un problème de stratification. Je n'ai pas confirmé si cela se produit sur l'appareil. Des idées sur la raison pour laquelle cela se produit?

Une autre question: Pourquoi le sélecteur setBounds de la feuille UIActionSheet a-t-il la valeur Y définie à une valeur si élevée pour un affichage correct? Définir la taille Y à 480 devrait créer un affichage en plein écran, n'est-ce pas? Mettre cette valeur à zéro la rend presque invisible. CÔTÉ NOTE: Le code collé ci-dessus ne positionne pas le UIDatePicker au même endroit que dans l'image, mais le problème de superposition se produit quel que soit l'emplacement de UIDatePicker. Le problème de stratification est uniquement en haut, pas en bas.

Répondre

8

Vous éviterez ainsi le problème d'affichage et d'obtenir un bien meilleur résultat à la recherche si vous mettez simplement le UIDatePicker dans une nouvelle vue et mettre en œuvre la diapositive Up- comportement du fond de vous-même. Ce n'est pas si dur.

  1. Créez un UIView contenant un sélecteur de dates et une barre d'outils avec un bouton Terminé. (Dans le code ou utiliser Interface Builder, n'a pas d'importance.)
  2. Ajoutez l'affichage contextuel en tant que sous-vue de votre vue principale.
  3. Définir le cadre de la vue popup afin qu'il soit le fond de l'écran: frame.origin.y = CGRectGetMaxY(mainView.bounds)
  4. Appel [UIView beginAnimations:nil context:nil]
  5. Définir le cadre à l'endroit où il devrait être: frame.origin.y -= CGRectGetHeight(popupView.bounds)
  6. Appel [UIView commitAnimations]

(Notez que la définition de trame est du pseudocode.)

C'est tout. Faites-le à l'envers lorsque vous avez besoin de rejeter la vue. Je pense que cela en vaudra la peine; coller un sélecteur de date dans un UIActionSheet semble incroyablement collant.

1

Avez-vous vraiment besoin de mettre votre sélecteur sur la feuille UIAction? Pourquoi n'utilisez-vous pas une propriété inputView de la classe UIResponder? Il affiche automatiquement UIDatePicker (ou toute autre vue) lorsque votre contrôle (par exemple UITextField) devient un premier répondeur. Un exemple d'utilisation de inputView avec le code source peut être trouvé ici: Working with pickers.

+0

inputView est disponible dans iOS 4.0 et versions ultérieures. Vous ne pouvez pas l'utiliser si vous voulez soutenir 3.1 –

1

essayer cette

[menu sendSubviewToBack: pickerView]; 

et déplacer aussi votre sélecteur 10 pixels vers le bas comme vous le voyez dans la capture d'écran, il n'est pas aliged au fond, peut-être

[pickerView setFrame:CGRectMake(0, 100, 320, 216)]; 
3

Utilisation des étapes de benzado ci-dessus, voici à peu près à quoi ressemblerait votre code si vous utilisez un UIView à la place d'une ActionSheet:

int height = 255; 

//create new view 
UIView * newView = [[UIView alloc] initWithFrame:CGRectMake(0, 200, 320, height)]; 
newView.backgroundColor = [UIColor colorWithWhite:1 alpha:1]; 

//add toolbar 
UIToolbar * toolbar = [[UIToolbar alloc] initWithFrame: CGRectMake(0, 0, 320, 40)]; 
toolbar.barStyle = UIBarStyleBlack; 

//add button 
UIBarButtonItem *infoButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Done" style:UIBarButtonItemStyleDone target:self action:nil]; 
toolbar.items = [NSArray arrayWithObjects:infoButtonItem, nil]; 

//add date picker 
UIDatePicker *datePicker = [[UIDatePicker alloc] init]; 
datePicker.datePickerMode = UIDatePickerModeDate; 
datePicker.hidden = NO; 
datePicker.date = [NSDate date]; 
datePicker.frame = CGRectMake(0, 40, 320, 250); 
[datePicker addTarget:self action:nil/*@selector(changeDateInLabel:)*/ forControlEvents:UIControlEventValueChanged]; 
[newView addSubview:datePicker]; 

//add popup view 
[newView addSubview:toolbar]; 
[self.view addSubview:newView]; 

//animate it onto the screen 
CGRect temp = newView.frame; 
temp.origin.y = CGRectGetMaxY(self.view.bounds); 
newView.frame = temp; 
[UIView beginAnimations:nil context:nil]; 
temp.origin.y -= height; 
newView.frame = temp; 
[UIView commitAnimations]; 

Je suis d'accord, il semble beaucoup mieux que d'utiliser ActionSheets qui sont conçus pour afficher des boutons, pas des sélecteurs. Vous devez toujours ajouter vos propres gestionnaires d'actions sur le bouton "Terminé" et lorsque l'utilisateur change le sélecteur mais cela devrait vous aider à démarrer.

Questions connexes