UIDatePicker не отображает колесо для дня месяца (dd) на iPad для iOS 8.1

У меня есть UIDatePicker в TableView со статическими ячейками. DatePicker отлично работает в iPhone версии приложения, но iPad, похоже, сжимает DatePicker, так что центральный столбец, в котором хранится день месяца (dd), не отображается. Обратите внимание, что "er" в "Ноябре" усечен.

Я проверил это, изменив стиль даты на испанский (dd MMMM YYY), и отобразится дата, как и первая половина месяца и весь год. Последняя половина каждого месяца называется усеченной.

Кто-нибудь столкнулся с такой проблемой при переносе на iOS 8?

Не уверен, сколько кода для публикации. Здесь больше всего в соответствующем классе

@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

Спасибо,

iPad version of datePicker

Ответ 1

Проблема, похоже, связана с Autolayout. Выберите подборщик даты в раскадровке и добавьте ограничение "Центр горизонтально в контейнере" с представлением содержимого UITableViewCell. См. Прикрепленное изображение для лучшего понимания. https://puu.sh/cONRZ/a1f9d935b2.png

Требуемый результат после применения ограничения;

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

Без ограничений;

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

Чтобы добавить ограничение, щелкните правой кнопкой мыши на UIDatePicker, удерживая и перетаскивая указатель на представление содержимого UITableViewCell и отпустите указатель. Теперь выберите ограничение "Центр горизонтально в контейнере". Пожалуйста, попробуйте написать в комментариях.

Ответ 2

Я столкнулся с этой же проблемой, месяцы выбора даты были отключены, а день месяца был невидимым. Ни одно из предложений в этой теме и в этом: UIDatePicker Cutting Off Text и Not Displaying Days работал у меня.

Это началось для меня на iOS8. Я не использую ограничений. Я не использую раскадровки, но я использую файлы nib для загрузки пользовательского интерфейса. Моя ситуация на iPad. У меня есть экран с режимом "просмотра". Когда пользователь нажимает кнопку, вид исчезает, и режим режима редактирования исчезает. Режим режима редактирования такой же, как режим "создать". Режим создания (достигнутый с помощью другого пути навигации) не отключает выбор даты.

Итак, я только начал делать сумасшедшие идеи, чтобы увидеть, могу ли я удалить глюк. В конце концов, это моя функция переключения в режим редактирования:

//@extern
- (void) showAddEditModeUI {
    [self fadeInView:self.editMembershipView];

  //WORKAROUND - ios8 issue was cutting off the date picker in the middle
  //the solution in this Qaru 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];

}

Как вы можете видеть, я вручную удаляю и снова добавляю UIDatePicker в представление. По какой-то причине это решило проблему. Я отправляю ответ здесь, на всякий случай, это помогает кому-то еще с этой довольно сумасшедшей проблемой.

Ответ 3

попробуйте это

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

Ответ 4

UPDATE: Дальнейшее исследование показывает, что это проблема с ограничениями, пытающимися подтолкнуть UIDateView в... Попробуйте отторгнуть ограничения и обработать их там... Конечно, это проблема ограничений.


Отключите опцию/свойство Clip SubViews/свойство UIDatePiker в панели инспектора атрибутов (под секцией просмотра), расположенной с правой стороны в редакторе раскадровки XCODE.

Attributes Inspector

Если отключить этот флажок, не работает, попробуйте отключить его, а затем снова включите его. У меня были смешанные результаты. Но в конце он должен работать.

Ответ 5

Когда я установил дату для персонализированной даты, появились мои рабочие дни.

Ответ 6

У меня была такая же проблема на iPhone 5 с 9.0.1. Проблема возникла в портретной ориентации. Я заметил, что если я повернул устройство в альбомный режим, дата была правильно нарисована. Более того, если я затем повернул его обратно в портретный режим, он затем правильно нарисовался.

Я добавил следующие две строки в мой метод viewDidLoad контроллера табличного вида:

    [self.tableView setNeedsLayout];

    [self.tableView layoutIfNeeded];

Это устранило проблему - сборщик даты теперь правильно рисует в первый раз в портретном режиме.