2014-10-14 9 views
11

Ich habe einen UIDatePicker in einem TableView mit statischen Zellen. Der DatePicker funktioniert perfekt in der iPhone-Version der App, aber das iPad scheint den DatePicker so zu komprimieren, dass die mittlere Spalte, die den Tag des Monats (dd) enthält, nicht angezeigt wird. Beachten Sie, dass das "er" in "November" abgeschnitten ist.UIDatePicker zeigt kein Rad für den Tag des Monats (dd) auf dem iPad für iOS 8.1

Ich verifiziert dies, indem Sie den Datumsformat auf Spanisch (TT MMMM YYY) ändern und das Datum zeigt, wie die erste Hälfte des Monats und das ganze Jahr. Die letzte Hälfte des Monats wird abgeschnitten.

Hat jemand solch ein Problem bei der Portierung auf iOS 8 festgestellt?

Nie sicher, wie viel Code zu buchen ist. Hier ist fast alles in der entsprechenden Klasse

@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 

Danke,

iPad version of datePicker

+0

Nur versucht, die Benutzeroberfläche in einem SplitViewController mit dem gleichen Ergebnis zu implementieren. Ich habe herausgefunden, dass ich das Datum ändern kann, indem ich dort blicke, wo das Datum erscheinen soll. Ich kann es einfach nicht sehen. – PhillipOReilly

+0

Ich habe das gleiche Storyboard für iPhone und iPad, aber ich bekomme es nur auf dem iPad – Jacobanks

+0

Ich brauche wirklich eine Antwort auf diese, die Version, die ich auf dem App Store habe, ist die eine mit diesem Fehler und die Leute sind nicht sehr glücklich – Jacobanks

Antwort

10

Das Problem scheint mit Autolayout verbunden zu sein. Wählen Sie die Datumsauswahl im Storyboard aus und fügen Sie in der Inhaltsansicht von UITableViewCell die Einschränkung "Horizontally in Container zentrieren" hinzu. Siehe das angehängte Bild zum besseren Verständnis. https://puu.sh/cONRZ/a1f9d935b2.png

Erforderliches Ergebnis nach dem Anwenden der Einschränkung;

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

ohne Einschränkungen;

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

Einschränkung hinzuzufügen, klicken Sie rechts auf den UIDatePicker, während der Zeiger auf UITableViewCell Inhalt Ansicht Halten und ziehen Sie den Zeiger freigeben. Wählen Sie nun die Einschränkung "Horizontal im Container zentrieren". Bitte versuchen Sie es und posten Sie in Kommentaren.

+2

Okay, Ihre Antwort wird als die Antwort markiert, um mich auf den richtigen Weg zu bringen. Ich habe mir die Constraint-Einstellungen in [Apples DateCell] (https://developer.apple.com/library/IOs/samplecode/DateCell/Introduction/Intro.html) Beispiel angesehen. Endlich hat es funktioniert. Vielen Dank! @ ScreamingCereal, aufgepasst! – PhillipOReilly

+0

Hat den Trick für mich gemacht. Unglaublich. –

+0

Danke Mann, es funktioniert jetzt :) –

0

UPDATE: Weitere Untersuchungen geht hervor, dass es ein Problem mit Einschränkungen versuchen, die UIDateView zu schieben ... Versuchen Brems die Einschränkungen und es von dort aus ... Sicher ist es ein Constraint-Problem. Turn "Clip Subviews" Option/Eigenschaft des UIDatePiker im Attribute-Inspektor (unter der Ansicht Abschnitt) befindet sich auf der rechten Seite in der Storyboard-Editor von XCODE off


.

Attributes Inspector

Wenn dieses Häkchen Ausschalten nicht funktioniert, versuchen Sie es ausschalten die App läuft und dann wieder einschalten. Ich hatte gemischte Ergebnisse. Aber am Ende sollte es funktionieren.

+0

das scheint nicht das Problem in meinem Fall zu sein. Aber danke für deinen Vorschlag. Phillip – PhillipOReilly

+0

Versuchen Sie, alle Einschränkungen zu entfernen und das Häkchen zu entfernen oder das Häkchen zu setzen ... Führen Sie es aus und versuchen Sie es erneut ... Ich habe es ein paar Mal versucht, bis es funktioniert .. Ich kann kein reproduzierbares Muster reparieren !! –

1

Ich habe in dasselbe Problem geraten, die Datumsauswahlmonate werden abgeschnitten und der Tag des Monats ist unsichtbar. Keiner der Vorschläge in diesem Thread noch in diesem: UIDatePicker Cutting Off Text & Not Displaying Days arbeitete für mich.

Es begann für mich auf iOS8. Ich verwende keine Einschränkungen. Ich verwende keine Storyboards, aber ich verwende nib-Dateien, um die Benutzeroberfläche zu laden. Meine Situation ist auf einem iPad. Ich habe einen Bildschirm mit einem "View" -Modus. Wenn ein Benutzer auf eine Schaltfläche klickt, wird die Ansicht ausgeblendet und eine Bearbeitungsmodusansicht wird eingeblendet.Die Bearbeitungsmodusansicht ist die gleiche wie der "Erstellen" -Modus. Der Erstellungsmodus (über einen anderen Navigationspfad erreicht) schneidet die Datumsauswahl nicht ab.

Also habe ich gerade angefangen, verrückte Ideen zu machen, um zu sehen, ob ich den Fehler entfernen könnte. Am Ende ist dies meine Funktion zum Umschalten in den Bearbeitungsmodus:

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

} 

Wie Sie sehen können, habe ich manuell entfernen und eine UIDatePicker der Ansicht erneut hinzufügen. Aus welchem ​​Grund auch immer, dies hat das Problem gelöst. Ich schreibe die Antwort hier, nur für den Fall, dass es jemand anderem mit diesem ziemlich ärgerlichen Problem hilft.

+0

Es wird interessant sein zu sehen, ob irgendjemand eine Erklärung dafür findet. – PhillipOReilly

0

Als ich die Datumsauswahl auf ein benutzerdefiniertes Datum einstellte, erschienen meine Wochentage.

1

dieses versuchen

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

ich auf einem iPhone 5 läuft 9.0.1 das gleiche Problem hatte. Das Problem trat im Hochformat auf. Ich habe festgestellt, dass das Datum richtig gezeichnet wurde, wenn ich das Gerät in den Querformat-Modus gedreht habe. Wenn ich es dann wieder in den Hochformatmodus gedreht habe, hat es dann korrekt gezeichnet.

Ich habe die folgenden zwei Zeilen an meinen Tisch viewDidLoad Methode des View-Controller:

[self.tableView setNeedsLayout]; 

    [self.tableView layoutIfNeeded]; 

Dies das Problem behoben - die Datumsauswahl jetzt beim ersten Mal korrekt im Portrait-Modus zeichnet.

Verwandte Themen