回答

1

对于iOS8上ActionSheetPicker-3.0是日期选择器等采摘的最佳解决方案。

animation

+1

没关系,我结束了(与采摘)创建新的控制器来代替。过渡是顺利和愉快的。我想苹果已经有足够的UIViews顶级选手了。 – Nekbeth 2014-09-22 19:58:49

+0

我无法使用它迅速。我手动添加它没有豆荚和使用桥头。请帮助 – 2016-12-26 08:31:40

1

不要将DatePicker嵌入UIActionSheet!从iOS 7开始,UIActionSheet不应该包含任何自定义子视图,我可以向你保证,在iOS 8中,添加到ActionSheet的任何子视图都不会显示!

你可以做什么,而不是和模拟ActionSheet是以下(低于它是一个日期选取器从底部动画的例子,并拥有一个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]; 

    } 

而驳回的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]; 
    } 
+0

pickerview声明为什么? – 2014-12-17 18:12:03

+0

@MarkWorsnop我不明白这个问题。请重新说明。 – Razvan 2014-12-17 23:14:56

1

使用UIAlertController,它是UIActionSheet的首选替代品。然后使用addSubView将UIDatePicker添加到UIAlertController.view而不是UIActionSheet。将UIAlertController的标题设置为与您为UIActionSheet执行的操作相同。以下是代码示例:

@interface MyControllerClass() { 
    @private UIDatePicker* datePicker; 
    } 
    @end 

    @implementation MyControllerClass 
    ... 
    -(void) showDatePicker { 
    if (!datePicker) 
     datePicker = [[UIDatePicker alloc] init]; 



    NSString *title = UIDeviceOrientationIsLandscape([UIDevice currentDevice].orientation) ? @"\n\n\n\n\n\n\n\n\n" : @"\n\n\n\n\n\n\n\n\n\n\n\n" ; 
     if (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_7_1){ 

      //Pre iOS 8 
      UIActionSheet *actionSheet = [[UIActionSheet alloc] 
              initWithTitle:title 
              delegate:self 
              cancelButtonTitle:nil 
              destructiveButtonTitle:nil 
              otherButtonTitles:@"OK", nil]; 

      [actionSheet addSubview:datePicker]; 
      [actionSheet setTag:ACTION_SHEET_DATEPICKER]; 
      [actionSheet showInView:self.aView]; 

     } else { 

      //for iOS 8 

      UIAlertController* datePickerContainer = [UIAlertController alertControllerWithTitle: title 
                         message:nil 
                        preferredStyle: UIAlertControllerStyleActionSheet]; 

      [datePickerContainer.view addSubview:datePicker]; 

      //Add autolayout constraints to position the datepicker 
      [datePicker setTranslatesAutoresizingMaskIntoConstraints:NO]; 

      // Create a dictionary to represent the view being positioned 
      NSDictionary *labelViewDictionary = NSDictionaryOfVariableBindings(datePicker); 

      NSArray* hConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[datePicker]-|" options:0 metrics:nil views:labelViewDictionary]; 
      [datePickerContainer.view addConstraints:hConstraints]; 
      NSArray* vConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[datePicker]" options:0 metrics:nil views:labelViewDictionary]; 
      [datePickerContainer.view addConstraints:vConstraints]; 

      [datePickerContainer addAction:[UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:^(UIAlertAction* action){ 
       [self dateSelected:nil]; 
      }]]; 

      [self presentViewController:datePickerContainer animated:YES completion:nil]; 

     } 
     } 
    } 

    ... 
    @end 

请根据需要进行修改和改进。

+0

我也试图在IOS8上做这个工作。你能告诉我datePicker被声明为什么吗? – 2014-12-17 17:57:23

+0

我已将声明添加到代码示例中。 – user59950 2014-12-19 09:43:26

0

我认为这是在第一评论一个小错误,你必须注意它, 这是编辑后的代码:

@property (strong, nonatomic) UIDatePicker *theDatePicker; 
    @property (strong, nonatomic) UIView *pickerView; 
- (IBAction)createDatePickerAndShow:(id)sender; 

,然后链接到createDatePickerAndShow按钮。 之后,创建你的选择器,将其嵌入到了UIView,并显示:

//.................Edit to (IBAction)createDatePickerAndShow:(id)sender 

- (IBAction)createDatePickerAndShow:(id)sender { 



     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]; 

//............add this to disable the warning of @selector(dismissDateSet)] 

     #pragma GCC diagnostic ignored "-Wundeclared-selector" 

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

//...........Edit to UIBarButtonItemStylePlain that is supported in ios 8 

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

     [controlToolbar setItems:[NSArray arrayWithObjects: cancelButton, spacer, 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 { 

//.................here edit _pickerView  

    [_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]; 



    } 

而驳回的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]; 
} 
相关问题