【问题标题】:How to add Date picker in Action Sheet?如何在操作表中添加日期选择器?
【发布时间】:2011-12-02 10:27:59
【问题描述】:
- (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];
}

【问题讨论】:

    标签: iphone objective-c ios ipad uidatepicker


    【解决方案1】:

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

    来自Documentation

    子类化注释

    UIActionSheet 不是为子类而设计的,也不应该添加 对其层次结构的看法。如果您需要展示一张包含更多内容的表格 自定义比 UIActionSheet API 提供的,您可以创建 你自己的并以模态方式呈现它 presentViewController:animated:completion:.

    重要提示:UIActionSheet 在 iOS 8 中已弃用。(请注意 UIActionSheetDelegate 也已弃用。)创建和管理操作 iOS 8 及更高版本中的工作表,而是使用 UIAlertController 和 UIAlertControllerStyleActionSheet 的首选样式。

    您可以很容易地创建一个 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];
        }
    

    【讨论】:

    • 完全正确,我同意你的观点,因为 iOS 8 现在禁止向 UIActionSheet 添加子视图并显示一个无法从你的应用程序中关闭的模态空视图,除非你杀死它!
    • 所以这应该有效吗?可能在某处做错了什么,但我没有在屏幕上看到任何东西。
    【解决方案2】:
        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];
        }];
    

    【讨论】:

      猜你喜欢
      • 2017-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-08
      • 1970-01-01
      相关资源
      最近更新 更多