2009-07-28 18 views
6

Qualcuno ha postato questo codice in un'altra domanda per mettere un'UIDatePicker in un UIAlertSheet:UIDatePicker in UIActionSheet stratificazione problema

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]; 

Ho modificato a questo:

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)]; 

questo produce correttamente un foglio di avviso posizionato (ignora il delegato nullo, questo è solo per scopi di visualizzazione). Il problema sta qui:

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

Come si può vedere, al di sopra minuto scroller, c'è un problema di stratificazione. Non ho confermato se ciò si verifica sul dispositivo. Qualche idea sul perchè questo sta succedendo?

Un'altra domanda: perché il selettore setBounds su UIActionSheet ha la dimensione Y impostata su un valore così elevato per la visualizzazione corretta? Impostare la dimensione Y su 480 dovrebbe creare una visualizzazione a schermo intero, in caso contrario? L'impostazione di questo valore su zero lo rende quasi invisibile.

LATO NOTA: il codice incollato sopra non posiziona UIDatePicker nella stessa posizione in cui si trova nell'immagine, ma il problema di sovrapposizione si verifica indipendentemente dall'ubicazione dell'UIDatePicker. Il problema del layering è solo in alto, non in basso.

risposta

8

Eviterete il problema di visualizzazione e ottenere un risultato molto più bello se si porta l'UIDatePicker in una nuova visione e implementare la slide-up- comportamento da capo a piedi. Non è così difficile.

  1. Creare un UIView contenente un selettore di date e una barra degli strumenti con un pulsante Fine. (In codice o usa Interface Builder, non importa.)
  2. Aggiungi la visualizzazione popup come sottoscheda della tua vista principale.
  3. set struttura della vista popup in modo che sia fuori la parte inferiore dello schermo: frame.origin.y = CGRectGetMaxY(mainView.bounds)
  4. chiamata [UIView beginAnimations:nil context:nil]
  5. Impostare il frame a dove dovrebbe essere: frame.origin.y -= CGRectGetHeight(popupView.bounds)
  6. chiamata [UIView commitAnimations]

(Si noti che il materiale di impostazione del frame è pseudocodice.)

Questo è tutto. Esegui al contrario quando è necessario chiudere la visualizzazione. Penso che ne varrà la pena; incollare un raccoglitore di date in un UIActionSheet sembra incredibilmente appiccicoso.

1

Hai davvero bisogno di mettere il tuo picker su UIActionSheet? Perché non usi una proprietà inputView dalla classe UIResponder? Mostra automaticamente UIDatePicker (o qualsiasi altra vista) quando il tuo controllo (ad esempio UITextField) diventa il primo risponditore. Un esempio di utilizzo di inputView con codice sorgente può essere trovato qui: Working with pickers.

+0

inputView è disponibile in iOS 4.0 e versioni successive. Non posso usarlo se vuoi supportare 3.1 –

1

provare questo

[menu sendSubviewToBack: pickerView]; 

e anche spostare il vostro raccoglitrice 10 pixel verso il basso, come si vede nello screenshot non è aliged al fondo, potrebbe essere

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

Utilizzando i passi di benzado sopra, ecco approssimativamente come sarebbe il tuo codice se utilizzi un UIView invece di un foglio di lavoro:

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]; 

Sono d'accordo, sembra molto meglio dell'utilizzo di ActionSheets che sono progettati per visualizzare pulsanti, non picker. Devi ancora aggiungere i tuoi gestori di azioni sul pulsante "Fatto" e quando l'utente cambia il selettore, ma questo dovrebbe iniziare.