Objective C使用“完成”button实现UIPickerView

我试图在UIPickerView中实现一个“完成”button类似于这个链接下的一个

我看了课程参考,但我找不到

谢谢

我添加了一个UIBoolButtonItem的UIBarButtonItem为“完成”button在我的xib框架设置,以便它最初不可见(Y值等于父视图的高度)。

每次用户访问选取器时,我都用一个animation改变了UIDatePicker和UIToolbar的框架(y值),以便与键盘一样从屏幕底部向上滑动。

看看我的代码如下。

- (IBAction)showPicker { if(pickerVisible == NO) { // create the picker and add it to the view if(self.datePicker == nil) self.datePicker = [[[UIDatePicker alloc] initWithFrame:CGRectMake(0, 460, 320, 216)] autorelease]; [self.datePicker setMaximumDate:[NSDate date]]; [self.datePicker setDatePickerMode:UIDatePickerModeDate]; [self.datePicker setHidden:NO]; [self.view addSubview:datePicker]; // the UIToolbar is referenced 'using self.datePickerToolbar' [UIView beginAnimations:@"showDatepicker" context:nil]; // animate for 0.3 secs. [UIView setAnimationDuration:0.3]; CGRect datepickerToolbarFrame = self.datePickerToolbar.frame; datepickerToolbarFrame.origin.y -= (self.datePicker.frame.size.height + self.datePickerToolbar.frame.size.height); self.datePickerToolbar.frame = datepickerToolbarFrame; CGRect datepickerFrame = self.datePicker.frame; datepickerFrame.origin.y -= (self.datePicker.frame.size.height + self.datePickerToolbar.frame.size.height); self.datePicker.frame = datepickerFrame; [UIView commitAnimations]; pickerVisible = YES; } } - (IBAction)done { if(pickerVisible == YES) { [UIView beginAnimations:@"hideDatepicker" context:nil]; [UIView setAnimationDuration:0.3]; CGRect datepickerToolbarFrame = self.datePickerToolbar.frame; datepickerToolbarFrame.origin.y += (self.datePicker.frame.size.height + self.datePickerToolbar.frame.size.height); self.datePickerToolbar.frame = datepickerToolbarFrame; CGRect datepickerFrame = self.datePicker.frame; datepickerFrame.origin.y += (self.datePicker.frame.size.height + self.datePickerToolbar.frame.size.height); self.datePicker.frame = datepickerFrame; [UIView commitAnimations]; // remove the picker after the animation is finished [self.datePicker performSelector:@selector(removeFromSuperview) withObject:nil afterDelay:0.3]; } } 

最简单的方法是在Interface Builder中对其进行build模。 这是一个包含UIToolbarUIPickerViewUIView

在这里输入图像说明

然后为UIView创build一个sockets并连接它。

在这里输入图像说明

如果你有一个UITextField你可以将自定义视图分配给它的inputView属性。

 [self.textField setInputView:self.customPicker]; 

或者,您可以添加select器到您的主视图…

 - (void)viewDidLoad { [super viewDidLoad]; self.customPicker.frame = CGRectMake(0, CGRectGetMaxY(self.view.frame), CGRectGetWidth(self.customPicker.frame), CGRectGetHeight(self.customPicker.frame)); [self.view addSubview:self.customPicker]; } 

…然后使用此方法显示或隐藏选取器。

 - (void)setPickerHidden:(BOOL)hidden { CGAffineTransform transform = hidden ? CGAffineTransformIdentity : CGAffineTransformMakeTranslation(0, -CGRectGetHeight(self.customPicker.frame)); [UIView animateWithDuration:0.3 animations:^{ self.customPicker.transform = transform; }]; } 

我创build了一个自定义类,它支持多个方向:

DateTimePicker.h

  @interface DateTimePicker : UIView { } @property (nonatomic, assign, readonly) UIDatePicker *picker; - (void) setMode: (UIDatePickerMode) mode; - (void) addTargetForDoneButton: (id) target action: (SEL) action; @end 

DateTimePicker.m

 #define MyDateTimePickerToolbarHeight 40 @interface DateTimePicker() @property (nonatomic, assign, readwrite) UIDatePicker *picker; @property (nonatomic, assign) id doneTarget; @property (nonatomic, assign) SEL doneSelector; - (void) donePressed; @end @implementation DateTimePicker @synthesize picker = _picker; @synthesize doneTarget = _doneTarget; @synthesize doneSelector = _doneSelector; - (id) initWithFrame: (CGRect) frame { if ((self = [super initWithFrame: frame])) { self.backgroundColor = [UIColor clearColor]; UIDatePicker *picker = [[UIDatePicker alloc] initWithFrame: CGRectMake(0, MyDateTimePickerToolbarHeight, frame.size.width, frame.size.height - MyDateTimePickerToolbarHeight)]; [self addSubview: picker]; UIToolbar *toolbar = [[UIToolbar alloc] initWithFrame: CGRectMake(0, 0, frame.size.width, MyDateTimePickerToolbarHeight)]; toolbar.barStyle = UIBarStyleBlackOpaque; toolbar.autoresizingMask = UIViewAutoresizingFlexibleWidth; UIBarButtonItem *doneButton = [[UIBarButtonItem alloc] initWithTitle: @"Done" style: UIBarButtonItemStyleBordered target: self action: @selector(donePressed)]; UIBarButtonItem* flexibleSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil]; toolbar.items = [NSArray arrayWithObjects:flexibleSpace, doneButton, nil]; [self addSubview: toolbar]; self.picker = picker; picker.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight|UIViewAutoresizingFlexibleTopMargin|UIViewAutoresizingFlexibleBottomMargin; self.autoresizesSubviews = YES; self.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight|UIViewAutoresizingFlexibleTopMargin|UIViewAutoresizingFlexibleBottomMargin; } return self; } - (void) setMode: (UIDatePickerMode) mode { self.picker.datePickerMode = mode; } - (void) donePressed { if (self.doneTarget) { [self.doneTarget performSelector:self.doneSelector withObject:nil afterDelay:0]; } } - (void) addTargetForDoneButton: (id) target action: (SEL) action { self.doneTarget = target; self.doneSelector = action; } 

在视图控制器中使用自定义视图:

 - (void)viewDidLoad { [super viewDidLoad]; UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect]; [button addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchDown]; [button setTitle:@"Show picker" forState:UIControlStateNormal]; button.frame = CGRectMake(100, 50, 100, 40.0); [self.view addSubview:button]; CGRect screenRect = [[UIScreen mainScreen] bounds]; CGFloat screenWidth = screenRect.size.width; CGFloat screenHeight = screenRect.size.height; picker = [[DateTimePicker alloc] initWithFrame:CGRectMake(0, screenHeight/2 - 35, screenWidth, screenHeight/2 + 35)]; [picker addTargetForDoneButton:self action:@selector(donePressed)]; [self.view addSubview:picker]; picker.hidden = YES; [picker setMode:UIDatePickerModeDate]; } -(void)donePressed { picker.hidden = YES; } -(void)buttonPressed:(id)sender { picker.hidden = NO; } 

希望这可以帮助。 🙂

有一个更优雅的解决scheme。 我不确定这是否是最近的(截至iOS7),但是这对我来说是非常出色的。

TJDatePicker.h

 @protocol TJDatePickerActionDelegate <NSObject> - (void)cancel:(id)sender; - (void)done:(id)sender; @end @interface TJDatePicker : UIDatePicker @property (strong, nonatomic) UIView *navInputView; @property (weak, nonatomic) id<TJDatePickerActionDelegate> actionDelegate; @end 

TJDatePicker.m

 #import "TJDatePicker.h" @interface TJDatePicker () @property (strong, nonatomic) TJButton *cancelButton; @property (strong, nonatomic) TJButton *doneButton; @end @implementation TJDatePicker - (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { [self updateSubviews]; } return self; } - (void)layoutSubviews { [super layoutSubviews]; [self updateSubviews]; } - (void)updateSubviews { self.navInputView.frame = CGRectMake(0, 0, self.width, 45); self.cancelButton.frame = CGRectMake(5, 5, 80, 35); CGFloat width = 80; self.doneButton.frame = CGRectMake(CGRectGetMaxX(self.navInputView.frame) - width, self.cancelButton.frame.origin.y, width, self.cancelButton.height); } - (UIView *)navInputView { if (!_navInputView) { _navInputView = [[UIView alloc] init]; _navInputView.backgroundColor = [UIColor whiteColor]; self.cancelButton = [UIButton buttonWithType:UIButtonTypeCustom]; [self.cancelButton setTitle:@"CANCEL" forState:UIControlStateNormal]; [self.cancelButton addTarget:self action:@selector(cancelButtonPressed) forControlEvents:UIControlEventTouchUpInside]; [_navInputView addSubview:self.cancelButton]; self.doneButton = [UIButton buttonWithType:UIButtonTypeCustom]; [self.doneButton setTitle:@"DONE" forState:UIControlStateNormal]; [self.doneButton addTarget:self action:@selector(doneButtonPressed) forControlEvents:UIControlEventTouchUpInside]; [_navInputView addSubview:self.doneButton]; } return _navInputView; } - (void)cancelButtonPressed { [self.actionDelegate cancel:self]; } - (void)doneButtonPressed { [self.actionDelegate done:self]; } 

然后在执行时…

 self.datePicker = [[TJDatePicker alloc] init]; self.datePicker.actionDelegate = self; self.textField.inputAccessoryView = self.datePicker.navInputView; 

这里的关键是使用您正在计划设置UIDatePickerUITextFieldinputAccessoryView

使用ActionSheetPicker获得工具栏中的“完成”button。 它是自己build造它的好select。

https://github.com/skywinder/ActionSheetPicker-3.0

成功! 好吧,我永远不会build议这样做,但这里是在你的特定的教程代码中创build完成button:

看故事板,我们可以看到当你点击“AddPersonTVC.h”(故事板右上angular的类)中的“angular色”框时,它popup一个名为“RollPickerTVCell.h”的类。

看着RollPickerTVCell.h,我们注意到整个类是“CoreDataTableViewCell”的子类,

 @interface RolePickerTVCell : CoreDataTableViewCell <UIPickerViewDataSource, UIPickerViewDelegate> 

看着“CoreDataTableViewCell.m”类,我们终于find了我们的uibarbuttonitem!

 UIBarButtonItem *doneBtn =[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(done:)]; 

如果你正在使用Table View Cell,而你没有使用UITextField(因此你不会使用Accessory View),那么我就是这么做的:

我创build了一个名为GWDatePickerCell的表格视图单元格,看起来像这样(不涉及.nib文件)。

GWDatePickerCell.h

 #import <UIKit/UIKit.h> @interface GWDatePickerCell : UITableViewCell @property (nonatomic, strong) UIDatePicker *datePicker; @property (nonatomic, strong) UIToolbar *toolbar; @property (nonatomic, strong) UIBarButtonItem *buttonDone; @end 

GWDatePickerCell.m

  #import "GWDatePickerCell.h" @implementation GWDatePickerCell - (id) initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier { if(!(self=[super initWithStyle:style reuseIdentifier:reuseIdentifier])) return nil; _datePicker = [[UIDatePicker alloc] init]; [_datePicker setMinuteInterval:5]; [_datePicker setDatePickerMode:UIDatePickerModeDateAndTime]; [self.contentView addSubview:_datePicker]; _toolbar = [[UIToolbar alloc] init]; _buttonDone = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:nil action:nil]; _toolbar.items = @[[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil], _buttonDone]; [self.contentView addSubview:_toolbar]; return self; } - (void)layoutSubviews{ [super layoutSubviews]; CGRect r = self.contentView.bounds; r.origin.y +=44; r.size.height = 216; CGRect tb = self.contentView.bounds; tb.size.height = 44; _datePicker.frame = r; _toolbar.frame = tb; } @end 

现在,我只需要在Table View中创build单元格就可以做到这一点:

  • 指定完成button的@select器。
  • heightForRowAtIndexPath设置正确的单元格高度