From 3e6b4cc62aea37423d74b8b2af6a771b0c084203 Mon Sep 17 00:00:00 2001 From: Jordan Date: Fri, 19 Sep 2014 22:47:39 +1200 Subject: [PATCH 1/3] Add support for iOS 8 by using UIViews directly instead of deprecated UIActionSheet --- src/ios/DatePicker.m | 58 ++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 56 insertions(+), 2 deletions(-) diff --git a/src/ios/DatePicker.m b/src/ios/DatePicker.m index 1ada714..ce86c5d 100644 --- a/src/ios/DatePicker.m +++ b/src/ios/DatePicker.m @@ -18,6 +18,7 @@ @interface DatePicker () @property (nonatomic) BOOL isVisible; @property (nonatomic) UIActionSheet* datePickerSheet; @property (nonatomic) UIDatePicker* datePicker; +@property (nonatomic) UIView* datePickerView; @property (nonatomic) UIPopoverController *datePickerPopover; @end @@ -37,7 +38,11 @@ - (void)show:(CDVInvokedUrlCommand*)command { - (BOOL)showForPhone:(NSMutableDictionary *)options { if(!self.isVisible){ - self.datePickerSheet = [self createActionSheet:options]; + if ([UIAlertController class]){ + self.datePickerView = [self createDatePickerView:options]; + } else { + self.datePickerSheet = [self createActionSheet:options]; + } self.isVisible = TRUE; } return true; @@ -53,7 +58,17 @@ - (BOOL)showForPad:(NSMutableDictionary *)options { - (void)hide { if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) { - [self.datePickerSheet dismissWithClickedButtonIndex:0 animated:YES]; + if ([UIAlertController class]){ + [UIView animateWithDuration:0.4 animations:^{ + [self.datePickerView setFrame:CGRectOffset(self.datePickerView.frame, 0, 300)]; + } completion:^(BOOL finished) { + [self.datePickerView removeFromSuperview]; + self.isVisible = NO; + }]; + } else { + [self.datePickerSheet dismissWithClickedButtonIndex:0 animated:YES]; + } + } else { [self.datePickerPopover dismissPopoverAnimated:YES]; } @@ -102,6 +117,45 @@ - (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverControl #pragma mark - Factory methods +-(UIView *)createDatePickerView:(NSMutableDictionary *)options { + + float viewHeight = 240; + + // create view offscreen to animate in + CGRect alertViewFrame = CGRectMake(0, viewHeight * 2, self.webView.frame.size.width, viewHeight); + UIView *alertView = [[UIView alloc] initWithFrame:alertViewFrame]; + [alertView setBackgroundColor:[UIColor whiteColor]]; + [alertView setUserInteractionEnabled:YES]; + + CGRect frame = CGRectMake(0, 40, self.webView.frame.size.width, viewHeight); + + if(!self.datePicker){ + self.datePicker = [self createDatePicker: options frame:frame]; + [self.datePicker setBackgroundColor:[UIColor whiteColor]]; + [self.datePicker addTarget:self action:@selector(dateChangedAction:) forControlEvents:UIControlEventValueChanged]; + } + [self updateDatePicker:options]; + [alertView addSubview:self.datePicker]; + + // cancel button + UISegmentedControl *cancelButton = [self createCancelButton:options]; + [alertView addSubview:cancelButton]; + // done button + UISegmentedControl *doneButton = [self createDoneButton:options]; + [alertView addSubview:doneButton]; + + [self.viewController.view insertSubview:alertView aboveSubview:self.webView]; + + // slide view onto screen + [UIView animateWithDuration:0.4 animations:^{ + [alertView setFrame:CGRectOffset(frame, 0, viewHeight)]; + }]; + + return alertView; + + +} + - (UIActionSheet *)createActionSheet:(NSMutableDictionary *)options { UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:nil delegate:self cancelButtonTitle:nil From 8b7a359d65403dabc46e498f16ef5e8c8f910d72 Mon Sep 17 00:00:00 2001 From: Jordan Date: Fri, 19 Sep 2014 23:01:41 +1200 Subject: [PATCH 2/3] adjusted animation duration, and position --- src/ios/DatePicker.m | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/ios/DatePicker.m b/src/ios/DatePicker.m index ce86c5d..fda1c6a 100644 --- a/src/ios/DatePicker.m +++ b/src/ios/DatePicker.m @@ -121,8 +121,8 @@ -(UIView *)createDatePickerView:(NSMutableDictionary *)options { float viewHeight = 240; - // create view offscreen to animate in - CGRect alertViewFrame = CGRectMake(0, viewHeight * 2, self.webView.frame.size.width, viewHeight); + // create view off screen + CGRect alertViewFrame = CGRectMake(0, self.webView.frame.size.height, self.webView.frame.size.width, viewHeight); UIView *alertView = [[UIView alloc] initWithFrame:alertViewFrame]; [alertView setBackgroundColor:[UIColor whiteColor]]; [alertView setUserInteractionEnabled:YES]; @@ -146,14 +146,13 @@ -(UIView *)createDatePickerView:(NSMutableDictionary *)options { [self.viewController.view insertSubview:alertView aboveSubview:self.webView]; - // slide view onto screen - [UIView animateWithDuration:0.4 animations:^{ - [alertView setFrame:CGRectOffset(frame, 0, viewHeight)]; + // animate veiw into view + [UIView animateWithDuration:0.3 animations:^{ + [alertView setFrame:CGRectMake(0, self.webView.frame.size.height - viewHeight, frame.size.width, frame.size.height)]; }]; return alertView; - } - (UIActionSheet *)createActionSheet:(NSMutableDictionary *)options { From df3fa23891b8ad39a97fd5da965d2e9e29c4c4dd Mon Sep 17 00:00:00 2001 From: Jordan Date: Mon, 10 Nov 2014 15:23:57 +1300 Subject: [PATCH 3/3] Changed date picker to use UIView way always. Also made width a variable size not fixed to 320. --- src/ios/DatePicker.m | 61 ++++++++++---------------------------------- 1 file changed, 14 insertions(+), 47 deletions(-) diff --git a/src/ios/DatePicker.m b/src/ios/DatePicker.m index fda1c6a..e2bf4b6 100644 --- a/src/ios/DatePicker.m +++ b/src/ios/DatePicker.m @@ -17,8 +17,8 @@ @interface DatePicker () @property (nonatomic) BOOL isVisible; @property (nonatomic) UIActionSheet* datePickerSheet; -@property (nonatomic) UIDatePicker* datePicker; @property (nonatomic) UIView* datePickerView; +@property (nonatomic) UIDatePicker* datePicker; @property (nonatomic) UIPopoverController *datePickerPopover; @end @@ -38,11 +38,8 @@ - (void)show:(CDVInvokedUrlCommand*)command { - (BOOL)showForPhone:(NSMutableDictionary *)options { if(!self.isVisible){ - if ([UIAlertController class]){ - self.datePickerView = [self createDatePickerView:options]; - } else { - self.datePickerSheet = [self createActionSheet:options]; - } + + self.datePickerView = [self createDatePickerView:options]; self.isVisible = TRUE; } return true; @@ -58,16 +55,12 @@ - (BOOL)showForPad:(NSMutableDictionary *)options { - (void)hide { if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) { - if ([UIAlertController class]){ - [UIView animateWithDuration:0.4 animations:^{ - [self.datePickerView setFrame:CGRectOffset(self.datePickerView.frame, 0, 300)]; - } completion:^(BOOL finished) { - [self.datePickerView removeFromSuperview]; - self.isVisible = NO; - }]; - } else { - [self.datePickerSheet dismissWithClickedButtonIndex:0 animated:YES]; - } + [UIView animateWithDuration:0.3 animations:^{ + [self.datePickerView setFrame:CGRectOffset(self.datePickerView.frame, 0, 300)]; + } completion:^(BOOL finished) { + [self.datePickerView removeFromSuperview]; + self.isVisible = NO; + }]; } else { [self.datePickerPopover dismissPopoverAnimated:YES]; @@ -117,6 +110,7 @@ - (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverControl #pragma mark - Factory methods + -(UIView *)createDatePickerView:(NSMutableDictionary *)options { float viewHeight = 240; @@ -143,7 +137,7 @@ -(UIView *)createDatePickerView:(NSMutableDictionary *)options { // done button UISegmentedControl *doneButton = [self createDoneButton:options]; [alertView addSubview:doneButton]; - + [self.viewController.view insertSubview:alertView aboveSubview:self.webView]; // animate veiw into view @@ -155,36 +149,9 @@ -(UIView *)createDatePickerView:(NSMutableDictionary *)options { } -- (UIActionSheet *)createActionSheet:(NSMutableDictionary *)options { - UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:nil - delegate:self cancelButtonTitle:nil - destructiveButtonTitle:nil - otherButtonTitles:nil]; - - [actionSheet setActionSheetStyle:UIActionSheetStyleBlackTranslucent]; - // date picker - CGRect frame = CGRectMake(0, 40, 0, 0); - if(!self.datePicker){ - self.datePicker = [self createDatePicker: options frame:frame]; - } - [self updateDatePicker:options]; - [actionSheet addSubview: self.datePicker]; - // cancel button - UISegmentedControl *cancelButton = [self createCancelButton:options]; - [actionSheet addSubview:cancelButton]; - // done button - UISegmentedControl *doneButton = [self createDoneButton:options]; - [actionSheet addSubview:doneButton]; - // show UIActionSheet - [actionSheet showInView:self.webView.superview]; - [actionSheet setBounds:CGRectMake(0, 0, 320, 485)]; - - return actionSheet; -} - - (UIPopoverController *)createPopover:(NSMutableDictionary *)options { - CGFloat pickerViewWidth = 320.0f; + CGFloat pickerViewWidth = self.webView.frame.size.width; CGFloat pickerViewHeight = 216.0f; UIView *datePickerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, pickerViewWidth, pickerViewHeight)]; @@ -302,7 +269,7 @@ - (UISegmentedControl *)createDoneButton:(NSMutableDictionary *)options { CGSize size = button.bounds.size; CGFloat width = size.width; CGFloat height = size.height; - CGFloat xPos = 320 - width - 5; // 320 == width of DatePicker, 5 == offset to right side hand + CGFloat xPos = self.webView.frame.size.width - width - 5; // 320 == width of DatePicker, 5 == offset to right side hand button.frame = CGRectMake(xPos, 7.0f, width, height); [button addTarget:self action:@selector(doneAction:) forControlEvents:UIControlEventValueChanged]; @@ -320,4 +287,4 @@ - (UIColor *)colorFromHexString:(NSString *)hexString { return [UIColor colorWithRed:((rgbValue & 0xFF0000) >> 16)/255.0 green:((rgbValue & 0xFF00) >> 8)/255.0 blue:(rgbValue & 0xFF)/255.0 alpha:1.0]; } -@end \ No newline at end of file +@end