我知道新UIAlertController的,但我还没有见过比创建一个UIViewController,添加UIPickerView作为一个子视图,并呈现其模态等的解决方案..这可能意味着将代表传递信息:(在iOS8的UIActionSheet中添加UIPickerView的最佳解决方案是什么?
任何人都可以使用后用UIAlertController里面选择器的例子..都在同一个控制器?
感谢
我知道新UIAlertController的,但我还没有见过比创建一个UIViewController,添加UIPickerView作为一个子视图,并呈现其模态等的解决方案..这可能意味着将代表传递信息:(在iOS8的UIActionSheet中添加UIPickerView的最佳解决方案是什么?
任何人都可以使用后用UIAlertController里面选择器的例子..都在同一个控制器?
感谢
对于iOS8上ActionSheetPicker-3.0是日期选择器等采摘的最佳解决方案。
不要将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];
}
pickerview声明为什么? – 2014-12-17 18:12:03
@MarkWorsnop我不明白这个问题。请重新说明。 – Razvan 2014-12-17 23:14:56
使用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
请根据需要进行修改和改进。
我也试图在IOS8上做这个工作。你能告诉我datePicker被声明为什么吗? – 2014-12-17 17:57:23
我已将声明添加到代码示例中。 – user59950 2014-12-19 09:43:26
我认为这是在第一评论一个小错误,你必须注意它, 这是编辑后的代码:
@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];
}
没关系,我结束了(与采摘)创建新的控制器来代替。过渡是顺利和愉快的。我想苹果已经有足够的UIViews顶级选手了。 – Nekbeth 2014-09-22 19:58:49
我无法使用它迅速。我手动添加它没有豆荚和使用桥头。请帮助 – 2016-12-26 08:31:40