blob: a626a12a8660b8ad767c316be64e7962d15a2374 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
#import "WXDatePickerManager.h"
#import <UIKit/UIDatePicker.h>
#import <UIKit/UIKit.h>
#import "WXConvert.h"
#import "WXUtility.h"
#define WXPickerHeight 266
@interface WXDatePickerManager() <UIGestureRecognizerDelegate>
@property(nonatomic,strong)UIDatePicker *datePicker;
@property(nonatomic,strong)UIView *backgroudView;
@property(nonatomic,strong)UIView *datePickerView;
@property(nonatomic,copy)NSString *type;
@property(nonatomic)BOOL isAnimating;
@end
@implementation WXDatePickerManager
@synthesize datePicker;
- (instancetype)init
{
self = [super init];
if (self) {
if(!self.backgroudView)
{
self.backgroudView = [self createBackgroundView];
UITapGestureRecognizer *tapGesture=[[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(hide)];
if (WX_SYS_VERSION_GREATER_THAN_OR_EQUAL_TO(@"11.0") && WX_SYS_VERSION_LESS_THAN(@"11.1")) {
tapGesture.delegate = self;
}
[self.backgroudView addGestureRecognizer:tapGesture];
}
if(!self.datePickerView)
{
self.datePickerView = [self createDatePickerView];
}
if(!datePicker)
{
datePicker = [[UIDatePicker alloc]init];
}
datePicker.datePickerMode=UIDatePickerModeDate;
if (@available(iOS 13.4, *)) {
datePicker.preferredDatePickerStyle = UIDatePickerStyleWheels;
}
CGRect pickerFrame = CGRectMake(0, 44, [UIScreen mainScreen].bounds.size.width, WXPickerHeight-44);
datePicker.backgroundColor = [UIColor whiteColor];
datePicker.frame = pickerFrame;
UIToolbar *toolBar=[[UIToolbar alloc]initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, 44)];
[toolBar setBackgroundColor:[UIColor whiteColor]];
UIBarButtonItem* noSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil];
noSpace.width=10;
UIBarButtonItem* doneBtn = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(done:)];
UIBarButtonItem *flexSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
UIBarButtonItem* cancelBtn = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:@selector(cancel:)];
[toolBar setItems:[NSArray arrayWithObjects:noSpace,cancelBtn,flexSpace,doneBtn,noSpace, nil]];
[self.datePickerView addSubview:datePicker];
[self.datePickerView addSubview:toolBar];
[self.backgroudView addSubview:self.datePickerView];
}
return self;
}
- (void)updateDatePicker:(NSDictionary *)attributes
{
NSString *type = [WXConvert NSString:attributes[@"type"]];
if(type)
{
_type = type;
if( [_type isEqualToString:@"date"])
{
self.datePicker.datePickerMode = UIDatePickerModeDate;
NSString *value = [WXConvert NSString:attributes[@"value"]];
if(value)
{
NSDate *date = [WXUtility dateStringToDate:value];
if(date)
{
self.datePicker.date =date;
}
}
NSString *max = [WXConvert NSString:attributes[@"max"]];
if(max)
{
NSDate *date = [WXUtility dateStringToDate:max];
if(date)
{
self.datePicker.maximumDate =date;
}
}
NSString *min = [WXConvert NSString:attributes[@"min"]];
if(min)
{
NSDate *date = [WXUtility dateStringToDate:min];
if(date)
{
self.datePicker.minimumDate =date;
}
}
}else if([_type isEqualToString:@"time"])
{
self.datePicker.datePickerMode = UIDatePickerModeTime;
NSString *value = [WXConvert NSString:attributes[@"value"]];
if(value)
{
NSDate *date = [WXUtility timeStringToDate:value];
if(date)
{
self.datePicker.date = date;
}
}
}
}
}
-(UIView *)createBackgroundView
{
UIView *view = [UIView new];
view.frame = [UIScreen mainScreen].bounds;
view.backgroundColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.4];
return view;
}
-(UIView *)createDatePickerView
{
UIView *view = [UIView new];
view.frame = CGRectMake(0, [UIScreen mainScreen].bounds.size.height, [UIScreen mainScreen].bounds.size.width, WXPickerHeight);
view.backgroundColor = [UIColor whiteColor];
return view;
}
-(void)show
{
UIWindow *window = [UIApplication sharedApplication].keyWindow;
[window addSubview:self.backgroudView];
UIAccessibilityPostNotification(UIAccessibilityScreenChangedNotification, self.datePicker);
if(self.isAnimating)
{
return;
}
self.isAnimating = YES;
self.backgroudView.hidden = NO;
[UIView animateWithDuration:0.35f animations:^{
self.datePickerView.frame = CGRectMake(0, [UIScreen mainScreen].bounds.size.height - WXPickerHeight, [UIScreen mainScreen].bounds.size.width, WXPickerHeight);
self.backgroudView.alpha = 1;
} completion:^(BOOL finished) {
self.isAnimating = NO;
}];
}
-(void)hide
{
if(self.isAnimating)
{
return;
}
self.isAnimating = YES;
[UIView animateWithDuration:0.35f animations:^{
self.datePickerView.frame = CGRectMake(0, [UIScreen mainScreen].bounds.size.height, [UIScreen mainScreen].bounds.size.width, WXPickerHeight);
self.backgroudView.alpha = 0;
} completion:^(BOOL finished) {
self.backgroudView.hidden = YES;
self.isAnimating = NO;
[self.backgroudView removeFromSuperview];
// move focus to original view;
if ([self.delegate isKindOfClass:[WXComponent class]]) {
UIAccessibilityPostNotification(UIAccessibilityScreenChangedNotification, ((WXComponent*)self.delegate).view);
}else if ([self.delegate isKindOfClass:[UIView class]]) {
UIAccessibilityPostNotification(UIAccessibilityScreenChangedNotification, (UIView*)self.delegate);
}
}];
}
-(void)cancel:(id)sender
{
[self hide];
}
-(void)done:(id)sender
{
[self hide];
if (self.delegate && [self.delegate respondsToSelector:@selector(fetchDatePickerValue:)]) {
NSString *value = @"";
if([_type isEqualToString:@"time"])
{
value = [WXUtility timeToString:self.datePicker.date];
}else if([_type isEqualToString:@"date"])
{
value = [WXUtility dateToString:self.datePicker.date];
}
[self.delegate fetchDatePickerValue:value];
}
}
#pragma mark - UIGestureRecognizerDelegate
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
if (self.datePickerView && [touch.view isDescendantOfView:self.datePickerView]) {
return NO;
}
return YES;
}
@end