UIDatePicker no muestra la rueda para el día del mes (dd) en iPad para iOS 8.1

Tengo un UIDatePicker en un TableView con celdas estáticas. The DatePicker funciona perfectamente en la versión de iPhone de la aplicación, pero el iPad parece comprimir el DatePicker para que no se muestre la columna central que contiene el día del mes (dd). Observe que el "er" en "Noviembre" está truncado.

Verifiqué esto cambiando el estilo de date a español (dd MMMM YYY) y la date aparece como lo hace la primera mitad del mes y todo el año. La última mitad del nombre de cada mes está truncada.

¿Alguien ha encontrado un problema como este en la transferencia a iOS 8?

Nunca estoy seguro de cuánto código publicar. Aquí hay casi todo en la class relevante

@property (strong, nonatomic) IBOutlet UITableViewCell *dateDisplay; @property (strong, nonatomic) IBOutlet UITableViewCell *datePickerCell; @property (strong, nonatomic) IBOutlet UIDatePicker *datePicker; @property (strong, nonatomic) IBOutlet UITableViewCell *unattached; @property (strong, nonatomic) IBOutlet UITableViewCell *middleschool; @property (strong, nonatomic) IBOutlet UITableViewCell *highschool; @property (strong, nonatomic) IBOutlet UITableViewCell *collegiate; @property (strong, nonatomic) IBOutlet UITableViewCell *youthclub; @end @implementation MeetFinderTableViewController @synthesize divisions = _divisions; @synthesize datePickerIndexPath = _datePickerIndexPath; @synthesize meetDate = _meetDate; @synthesize doSaveUserDefaults = _doSaveUserDefaults; @synthesize divisionSelected = _divisionSelected; @synthesize arrayOfReuseIds = _arrayOfReuseIds; @synthesize myTV = _myTV; # pragma SplitViewController Variables @synthesize meetIDForSegue = _meetIDForSegue; @synthesize meetNameForSegue = _meetNameForSegue; #pragma SetUp Configuration -(void) setArrayOfReuseIds:(NSArray *)arrayOfReuseIds { _arrayOfReuseIds = arrayOfReuseIds; } -(void) setMyTV:(UITableView *)myTV { _myTV = myTV; } -(void) setMeetDate:(NSDate *)meetDate { if(_meetDate != meetDate){ _meetDate = meetDate; [self setDoSaveUserDefaults:YES]; } } - (id)initWithStyle:(UITableViewStyle)style { self = [super initWithStyle:style]; if (self) { // Custom initialization } return self; } - (MapViewController *)splitViewMapViewController { id mvc = [self.splitViewController.viewControllers lastObject]; if (![mvc isKindOfClass:[MapViewController class]]) { mvc = nil; } if (debug==1) NSLog(@"%@ = %@",NSStringFromSelector(_cmd), mvc); return mvc; } - (void)awakeFromNib { [super awakeFromNib]; self.splitViewController.delegate = self; if (debug==1) NSLog(@"Do I make it to %@",NSStringFromSelector(_cmd)); } - (void)viewDidLoad { [super viewDidLoad]; self.clearsSelectionOnViewWillAppear = YES; self.datePicker.hidden = YES; self.datePickerIsShowing = NO; [self setArrayOfReuseIds:[[NSArray alloc] initWithObjects: @"unattached",@"middleschool",@"highschool",@"collegiate",@"youthclub", nil]]; [self setDivisions:[[NSArray alloc] initWithObjects: @"Unattached", @"Middle School", @"High School", @"Collegiate", @"Youth Club", nil]]; if ([[NSUserDefaults standardUserDefaults] objectForKey:@"divisionPreference"]) { [self setDivisionSelected:[[NSUserDefaults standardUserDefaults] objectForKey:@"divisionPreference"]]; } else [self setDivisionSelected:[NSNumber numberWithInt:highSchoolTag]]; if ([[NSUserDefaults standardUserDefaults] objectForKey:@"datePreferenceForMeetSearch"]) { [self setMeetDate:[[NSUserDefaults standardUserDefaults] objectForKey:@"datePreferenceForMeetSearch"]]; } else [self setMeetDate:[NSDate date]]; [self setMyTV:self.tableView]; if (debug==1) NSLog(@"In %@ before check splitViewMapViewController",NSStringFromSelector(_cmd)); if ([self splitViewMapViewController]) { // if in split view [self splitViewMapViewController].dateForSearch = self.meetDate; [self splitViewMapViewController].levelOfCompetition = [self.divisionSelected stringValue]; } } -(void) viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [self setupDateLabel]; [self setUpMenuItems]; if (debug==1) NSLog(@"Do I make it to %@",NSStringFromSelector(_cmd)); } -(void) viewWillDisappear:(BOOL)animated { [super viewWillDisappear:YES]; if (self.doSaveUserDefaults) { NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; [userDefaults setObject:self.divisionSelected forKey:@"divisionPreference"]; [userDefaults setObject:self.meetDate forKey:@"datePreferenceForMeetSearch"]; [userDefaults synchronize]; NSLog(@"Getting ready to set newPreferences with divisionSelected: %@ and dateOfMeet: %@", [self.divisionSelected stringValue], self.meetDate); MapPreferencesDataDelegate *newPreferences = [[MapPreferencesDataDelegate alloc] initWithName:[self.divisionSelected stringValue] dateOfMeet:self.meetDate]; [self.delegate saveMeetSearchPreferences:newPreferences]; } } - (void)setupDateLabel { self.dateFormatter = [[NSDateFormatter alloc] init]; [self.dateFormatter setDateStyle:NSDateFormatterMediumStyle]; [self.dateFormatter setTimeStyle:NSDateFormatterNoStyle]; NSDate *defaultDate; if (!self.meetDate || self.meetDate == nil) { defaultDate = [NSDate date]; [self setMeetDate:defaultDate]; } else defaultDate = self.meetDate; self.dateDisplay.textLabel.text = [NSString stringWithFormat:@"%@",stringForDateDisplay]; self.dateDisplay.textLabel.textColor = [self.tableView tintColor]; self.dateDisplay.detailTextLabel.text = [self.dateFormatter stringFromDate:defaultDate]; self.dateDisplay.detailTextLabel.textColor = [self.tableView tintColor]; } - (void)showDatePickerCell { self.datePickerIsShowing = YES; [self.tableView beginUpdates]; [self.tableView endUpdates]; self.datePicker.hidden = NO; self.datePicker.alpha = 0.0f; [UIView animateWithDuration:0.25 animations:^{ self.datePicker.alpha = 1.0f; }]; } - (void)hideDatePickerCell { self.datePickerIsShowing = NO; [self.tableView beginUpdates]; [self.tableView endUpdates]; [UIView animateWithDuration:0.25 animations:^{ self.datePicker.alpha = 0.0f; } completion:^(BOOL finished){ self.datePicker.hidden = YES; }]; } -(void) placeCheckMarkForDivisionSelection:(NSInteger) myDivisionPreference #pragma mark - Table view data source -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { switch (indexPath.section) { case 0: { if (indexPath.row == 0){ self.datePicker.hidden = NO; self.datePickerIsShowing = !self.datePickerIsShowing; [UIView animateWithDuration:.4 animations:^{ [self.tableView reloadRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:1 inSection:0]] withRowAnimation:UITableViewRowAnimationFade]; [self.tableView reloadData]; }]; } break; } case 1: { UITableViewCell *cell1 = [tableView cellForRowAtIndexPath:indexPath]; NSInteger tagForSelectedDivision = cell1.tag; [self placeCheckMarkForDivisionSelection:tagForSelectedDivision]; // [self setDivisionSelected:[NSNumber numberWithInteger:tagForSelectedDivision]]; if ([self splitViewMapViewController]) [self splitViewMapViewController].levelOfCompetition = [self.divisionSelected stringValue]; break; } } [self.tableView deselectRowAtIndexPath:indexPath animated:YES]; } -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { if (indexPath.section == 0 && indexPath.row == 1) { // this is my picker cell if (self.datePickerIsShowing) { return 219; } else { return 0; } } else { return self.tableView.rowHeight; } } - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return numberOfSections; } #pragma mark - Action methods - (IBAction)pickerDateChanged:(UIDatePicker *)sender { if ([self splitViewMapViewController]) { // if in split view [self splitViewMapViewController].dateForSearch = sender.date; [self splitViewMapViewController].levelOfCompetition = [self.divisionSelected stringValue]; } self.dateDisplay.detailTextLabel.text = [self.dateFormatter stringFromDate:sender.date]; self.meetDate = sender.date; [self setMeetDate:sender.date]; } - (void) displayAlertBoxWithTitle:(NSString*)title message:(NSString*) myMessage cancelButton:(NSString*) cancelText { UIAlertView *alert = [[UIAlertView alloc] initWithTitle:title message:myMessage delegate:nil cancelButtonTitle:cancelText otherButtonTitles:nil]; [alert show]; } #pragma SplitViewController Implementation - (id <SplitViewBarButtonItemPresenter>)splitViewBarButtonItemPresenter { id detailVC = [self.splitViewController.viewControllers lastObject]; if (![detailVC conformsToProtocol:@protocol(SplitViewBarButtonItemPresenter)]) { detailVC = nil; } return detailVC; } - (BOOL)splitViewController:(UISplitViewController *)svc shouldHideViewController:(UIViewController *)vc inOrientation:(UIInterfaceOrientation)orientation { return NO; } - (void)splitViewController:(UISplitViewController *)svc willHideViewController:(UIViewController *)aViewController withBarButtonItem:(UIBarButtonItem *)barButtonItem forPopoverController:(UIPopoverController *)pc { barButtonItem.title = barButtonItemTitle; [self splitViewBarButtonItemPresenter].splitViewBarButtonItem = barButtonItem; } - (void)splitViewController:(UISplitViewController *)svc willShowViewController:(UIViewController *)aViewController invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem { [self splitViewBarButtonItemPresenter].splitViewBarButtonItem = nil; } - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { return YES; } @end 

Gracias,

Versión para iPad de datePicker

El problema parece estar asociado con Autolayout. Seleccione el selector de date en el guión gráfico y agregue la restricción "Centrar horizontalmente en el contenedor" con la vista de contenido de UITableViewCell. Vea la image adjunta para una mejor comprensión. https://puu.sh/cONRZ/a1f9d935b2.png

Resultado requerido después de aplicar la restricción;

https://puu.sh/cOO43/20947cf334.png

Sin restricciones;

https://puu.sh/cOOnR/09f3ed8721.png

Para agregar una restricción, haga clic derecho en el UIDatePicker mientras mantiene presionado y arrastre el puntero a la vista de contenido de UITableViewCell y suelte el puntero. Ahora select la restricción "Centrar horizontalmente en contenedor". Intenta y publica en los comentarios.

He estado encontrando este mismo problema, los meses de recolección de dates se han cortado y el día del mes es invisible. Ninguna de las sugerencias en este hilo ni en este: UIDatePicker Cortando text y no se muestran Días trabajados para mí.

Empezó por mí en iOS8. No estoy usando restricciones. No estoy usando storyboards, pero estoy usando files nib para cargar la interfaz de usuario. Mi situación está en un iPad. Tengo una pantalla con un modo de "vista". Cuando un usuario toca un button, la vista se desvanece y se desvanece una vista del modo 'editar'. La vista del modo de edición es igual que el modo 'crear'. El modo de creación (alcanzado a través de otra ruta de navigation) no corta el selector de date.

Entonces, comencé a hacer ideas locas para ver si podía eliminar el problema técnico. Al final, esta es mi function para cambiar al modo de edición:

 //@extern - (void) showAddEditModeUI { [self fadeInView:self.editMembershipView]; //WORKAROUND - ios8 issue was cutting off the date picker in the middle //the solution in this stack overflow didn't work for me: //https://stackoverflow.com/questions/26352797/uidatepicker-not-displaying-wheel-for-day-of-the-month-dd-on-ipad-for-ios-8-1 //but this did work UIDatePicker* dPicker = [[UIDatePicker alloc] initWithFrame:self.startDatePicker.frame]; dPicker.date = self.startDatePicker.date; dPicker.datePickerMode = self.startDatePicker.datePickerMode; [self.startDatePicker removeFromSuperview]; self.startDatePicker = dPicker; [self.editMembershipView addSubview:self.startDatePicker]; } 

Como puede ver, elimino manualmente y vuelvo a agregar un UIDatePicker a la vista. Por alguna razón, esto resolvió el problema. Estoy publicando la respuesta aquí, solo en caso de que ayude a otra persona con este problema bastante exasperante.

testing esto

 [myDatePicker setDatePickerMode:UIDatePickerModeDateAndTime]; [myDatePicker setDatePickerMode:UIDatePickerModeDate]; 

ACTUALIZACIÓN: una investigación adicional revela que es un problema con las restricciones que tratan de impulsar el UIDateView en … Intente frenar las restricciones y resolverlo desde allí … Seguro que es un problema de restricciones.


Desactive la opción / propiedad "Clip SubViews" de UIDatePiker en el panel de inspector de attributes (debajo de la sección de vista) ubicado a la derecha en el editor de Storyboard de XCODE.

Atributos Inspector

Si desactivar esta marca de verificación no funciona, intente desactivarla ejecutando la aplicación y volviéndola a encenderla. Tuve resultados mixtos Pero al final debería funcionar.

Cuando establecí el selector de date en una date personalizada, aparecieron mis días de semana.

Tuve el mismo problema en un iPhone 5 con 9.0.1. El problema ocurrió en la orientación vertical. Noté que si giraba el dispositivo al modo horizontal, la date se dibujaba correctamente. Además, si luego giré de nuevo al modo vertical, dibujé correctamente.

Agregué las siguientes dos líneas al método viewDidLoad del controller de vista de tabla:

  [self.tableView setNeedsLayout]; [self.tableView layoutIfNeeded]; 

Esto solucionó el problema: el selector de date ahora dibuja correctamente la primera vez en modo vertical.