2009-07-28 9 views
6

Alguien envió este código en otra pregunta para poner un UIDatePicker en un UIAlertSheet:UIDatePicker en UIActionSheet capas 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]; 

lo he modificado para esto:

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

Esto produce una hoja de alerta correctamente posicionado (ignore el delegado nulo; esto es solo para fines de visualización). El problema radica aquí:

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

Como se puede ver, por encima de la barra de desplazamiento minutos, hay un problema de estratificación. No he confirmado si esto ocurre en el dispositivo. ¿Alguna idea de porqué está pasando esto?

Otra pregunta: ¿Por qué el selector setBounds en la hoja UIActionSheet tiene el tamaño Y establecido en un valor tan alto para la visualización correcta? Establecer el tamaño Y a 480 debería crear una pantalla completa, ¿no es así? Establecer este valor en cero lo hace casi invisible.

LADO NOTA: El código pegado arriba no coloca el UIDatePicker en el mismo lugar que está en la imagen, pero el problema de superposición ocurre sin importar dónde se coloca el UIDatePicker. El problema de la superposición solo está en la parte superior, no en la parte inferior.

Respuesta

8

Va a evitar el problema de la pantalla y obtener un resultado mucho mejor mirando si sólo tiene que poner la UIDatePicker en un nuevo punto de vista y poner en práctica la diapositiva-UP- Comportamiento desde abajo. No es tan dificil.

  1. Cree una UIView que contenga un selector de fecha y una barra de herramientas con un botón Hecho en él. (En código o use Interface Builder, no importa.)
  2. Agregue la vista emergente como una subvista de su vista principal.
  3. set marco de la vista emergente de modo que está fuera de la parte inferior de la pantalla: frame.origin.y = CGRectGetMaxY(mainView.bounds)
  4. llamada [UIView beginAnimations:nil context:nil]
  5. Establece el cuadro a donde debe estar: frame.origin.y -= CGRectGetHeight(popupView.bounds)
  6. llamada [UIView commitAnimations]

(Tenga en cuenta que las cosas de configuración de cuadros son pseudocódigos.)

Eso es todo. Hazlo al revés cuando necesites descartar la vista. Creo que valdrá la pena el problema; poner un selector de fecha en una UIActionSheet se ve increíblemente hortera.

1

¿Realmente necesita poner su selector en la ficha UIActionSheet? ¿Por qué no usas una propiedad inputView de la clase UIResponder? Muestra UIDatePicker (o cualquier otra vista) automáticamente cuando su control (por ejemplo, UITextField) se convierte en un primer respondedor. Puede encontrar un ejemplo del uso de inputView con el código fuente aquí: Working with pickers.

+0

inputView está disponible en iOS 4.0 y superior. No se puede usar si quieres soportar 3.1 –

1

probar esto

[menu sendSubviewToBack: pickerView]; 

y también mover el selector de 10 píxeles hacia abajo como se ve en la pantalla no se aliged a la parte inferior, que podría ser

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

El uso de medidas de benzado anteriormente, aquí está aproximadamente cómo se vería su código si utiliza una UIView en lugar de una Hoja de acciones:

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

Acepto, parece mucho mejor que usar ActionSheets, que están diseñadas para mostrar botones, no selectores. Aún debe agregar sus propios manejadores de acción en el botón "Listo" y cuando el usuario cambie el selector, pero esto debería ayudarlo a comenzar.