I have a UIDatePicker in a TableView with Static Cells. The DatePicker works perfectly in iPhone version of App, but the iPad seems to compress the DatePicker so that the center column that holds the day of the month (dd) does not display. Notice that the "er" in "November" is truncated.
I verified this by changing the date style to Spanish (dd MMMM YYY) and the date displays as does the first half of the month and all of the year. The last half of each month's name is truncated.
Has anyone encountered a problem like this in porting over to iOS 8?
Never sure how much code to post. Here is most everything in the relevant class
@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
Thanks,
The problem seems to be associated with Autolayout.
Please select the date picker in storyboard and add "Center Horizontly in container" constraint with UITableViewCell's content view. See the attached image for better understanding.
Required result after applying constraint;
Without Constraints;
To add constraint, right click on the UIDatePicker while holding and drag the pointer to UITableViewCell's content view and release the pointer. Now select the "Center Horizontly in container" constraint. Please try and post in comments.