繁体   English   中英

如何在操作表中添加日期选择器?

[英]How to add Date picker in Action Sheet?

- (IBAction) showCatPicker {

    if (self.catList !=nil) {
        self.catList=nil;
        [catList release];
    }
    self.catList =  [[NSMutableArray alloc] init];

        self.actionSheet = [[UIActionSheet alloc] initWithTitle:nil delegate:nil cancelButtonTitle:nil destructiveButtonTitle:nil otherButtonTitles:nil];   
    [self.actionSheet setActionSheetStyle:UIActionSheetStyleBlackTranslucent];

    CGRect pickerFrame = CGRectMake(0, 40, 0, 0);   
    if(self.catPicker == nil) {     
        self.catPicker = [[UIPickerView alloc] initWithFrame:pickerFrame];

        self.catPicker.showsSelectionIndicator = YES;
        self.catPicker.dataSource = self;
        self.catPicker.opaque = YES;
        self.catPicker.multipleTouchEnabled = YES;
        self.catPicker.userInteractionEnabled = YES;
        self.catPicker.delegate = self;     
    }

    [self.actionSheet addSubview:self.catPicker];

    UISegmentedControl *closeButton = [[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObject:@"Select"]];
    closeButton.momentary = YES; 
    closeButton.frame = CGRectMake(260, 7.0f, 50.0f, 30.0f);
    closeButton.segmentedControlStyle = UISegmentedControlStyleBar;
    closeButton.tintColor = [UIColor colorWithRed:19.0/255 green:122.0/255 blue:53.0/255 alpha:1.0];
    [closeButton addTarget:self action:@selector(dismissGenderPicker:) forControlEvents:UIControlEventValueChanged];

    UISegmentedControl *cancelButton = [[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObject:@"Cancel"]];
    cancelButton.momentary = YES; 
    cancelButton.frame = CGRectMake(10, 7.0f, 50.0f, 30.0f);
    cancelButton.segmentedControlStyle = UISegmentedControlStyleBar;
    cancelButton.tintColor = [UIColor colorWithRed:19.0/255 green:122.0/255 blue:53.0/255 alpha:1.0];
    [cancelButton addTarget:self action:@selector(cancelActionSheet) forControlEvents:UIControlEventValueChanged];

    [self.actionSheet addSubview:cancelButton]; 
    [self.actionSheet addSubview:closeButton];

    [cancelButton release]; 
    [closeButton release];  
    [self.actionSheet showInView:self.view];    
    [self.actionSheet setBounds:CGRectMake(0, 0, 320, 485)];
    [catPicker reloadComponent:0];
}

您绝对不应该使用UIActionSheet来保存UIDatePicker,因为不建议使用此功能!

文档中

子类注释

UIActionSheet并非旨在被子类化,也不应将视图添加到其层次结构中。 如果您需要呈现一个比UIActionSheet API提供的自定义表更多的工作表,则可以创建自己的工作表并使用presentViewController:animated:completion:进行模态显示。

重要说明:iOS 8中不推荐使用UIActionSheet。(请注意,UIActionSheetDelegate也已不推荐使用。)要在iOS 8和更高版本中创建和管理操作表,请改用UIAlertController和UIAlertControllerStyleActionSheet的preferredStyle。

您可以很容易地做的是创建一个UIView来保存UIDatePicker并根据需要对视图进行动画处理。 您甚至可以根据需要向其中添加一个UIToolbar。

这是一个例子:

创建两个属性:

@property (strong, nonatomic) UIDatePicker *theDatePicker;
@property (strong, nonatomic) UIView *pickerView;

创建您的选择器,将其嵌入到UIView并显示:

    -(void) createDatePickerAndShow {

        UIToolbar *controlToolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, pickerView.bounds.size.width, 44)];

        [controlToolbar sizeToFit];

        UIBarButtonItem *spacer = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];

        UIBarButtonItem *setButton = [[UIBarButtonItem alloc] initWithTitle:@"Set" style:UIBarButtonItemStyleDone target:self action:@selector(dismissDateSet)];

        UIBarButtonItem *cancelButton = [[UIBarButtonItem alloc] initWithTitle:@"Cancel" style:UIBarButtonItemStyleBordered target:self action:@selector(cancelDateSet)];

        [controlToolbar setItems:[NSArray arrayWithObjects:spacer, cancelButton, setButton, nil] animated:NO];


        [theDatePicker setFrame:CGRectMake(0, controlToolbar.frame.size.height - 15, theDatePicker.frame.size.width, theDatePicker.frame.size.height)];

        if (!pickerView) {
            pickerView = [[UIView alloc] initWithFrame:theDatePicker.frame];
        } else {
            [pickerView setHidden:NO];
        }


        CGFloat pickerViewYpositionHidden = self.view.frame.size.height + pickerView.frame.size.height;

        CGFloat pickerViewYposition = self.view.frame.size.height - pickerView.frame.size.height;

        [pickerView setFrame:CGRectMake(pickerView.frame.origin.x,
                                        pickerViewYpositionHidden,
                                        pickerView.frame.size.width,
                                        pickerView.frame.size.height)];
        [pickerView setBackgroundColor:[UIColor whiteColor]];
        [pickerView addSubview:controlToolbar];
        [pickerView addSubview:theDatePicker];
        [theDatePicker setHidden:NO];


        [self.view addSubview:pickerView];

        [UIView animateWithDuration:0.5f
                         animations:^{
                             [pickerView setFrame:CGRectMake(pickerView.frame.origin.x,
                                                             pickerViewYposition,
                                                             pickerView.frame.size.width,
                                                             pickerView.frame.size.height)];
                         }
                         completion:nil];

    }

And to dismiss the DatePicker:

    -(void) cancelDateSet {    
    CGFloat pickerViewYpositionHidden = self.view.frame.size.height + pickerView.frame.size.height;    

        [UIView animateWithDuration:0.5f
                         animations:^{
                             [pickerView setFrame:CGRectMake(pickerView.frame.origin.x,
                                                             pickerViewYpositionHidden,
                                                             pickerView.frame.size.width,
                                                             pickerView.frame.size.height)];
                         }
                         completion:nil];
    }
    self.view.userInteractionEnabled = NO;
    self.blurView = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    [self.blurView setBackgroundColor:[UIColor lightGrayColor]];
    [self.blurView setAlpha:0.3];
    [[[UIApplication sharedApplication] delegate].window addSubview:self.blurView];

    CGRect pickerFrame = CGRectMake(0, 40, 0, 0);
    UIDatePicker *pickerView = [[UIDatePicker alloc] initWithFrame:pickerFrame];
    pickerView.datePickerMode = UIDatePickerModeDate;
    [pickerView setBackgroundColor:[UIColor whiteColor]];
    [pickerView addTarget:self action:@selector(pickerChanged:) forControlEvents:UIControlEventValueChanged];

    __block CGRect frame = CGRectMake(0, [[UIScreen mainScreen] bounds].size.height, [[UIScreen mainScreen] bounds].size.width, 220);
    self.viewForPicker = [[UIView alloc] initWithFrame:frame];
    [self.viewForPicker setBackgroundColor:[UIColor whiteColor]];
    [self.viewForPicker addSubview:pickerView];
    [[[[UIApplication sharedApplication] delegate] window] addSubview:self.viewForPicker];

    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
    [button setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
    [button setTitleColor:[UIColor lightGrayColor] forState:UIControlStateHighlighted];
    [button setTitle:@"Done" forState:UIControlStateNormal];
    [button addTarget:self action:@selector(doneButtonPressed:) forControlEvents:UIControlEventTouchUpInside];
    [button setFrame:CGRectMake(250, 15, 60, 30)];
    [button.layer setCornerRadius:5.0];
    [button.layer setBorderWidth:1.0];
    [button.layer setBorderColor:[[IMAppStyle appColor] CGColor]];
    [self.viewForPicker addSubview:button];
    [self.viewForPicker.layer setCornerRadius:8.0];

    float animationDuration = 0.25;
    [UIView animateWithDuration:animationDuration animations:^{
        frame.origin.y -= (180+40+35);
        [self.viewForPicker setFrame:frame];
    }];

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM