7

このリンクの下にあるものと同様のUIPickerViewに「完了」ボタンを実装しようとしています

クラスリファレンスを調べましたが、見つかりませんでした

ありがとう

4

7 に答える 7

40

それを行う最も簡単な方法は、InterfaceBuilderでモデル化することです。とをUIView含みUIToolbarますUIPickerView

ここに画像の説明を入力してください

次に、のコンセントを作成してUIView接続します。

ここに画像の説明を入力してください

その後、があれば、カスタムビューをそのプロパティUITextFieldに割り当てることができます。inputView

[self.textField setInputView:self.customPicker];

または、メインビューにピッカーを追加することもできます...

- (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;
    }];
}
于 2012-05-22T15:28:46.153 に答える
6

xibの「完了」ボタンにUIBarButtonItemを含むUIToolbarを追加し、フレームを設定して、最初は表示されないようにしました(y値は親ビューの高さに等しい)。

ユーザーがピッカーにアクセスするたびに、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];
    }
}
于 2012-05-22T15:29:59.020 に答える
2

カスタムクラスを作成します。これは複数の方向をサポートします。

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

お役に立てれば。:)

于 2013-03-28T08:26:32.763 に答える
1

よりエレガントな解決策があります。これが最近のものかどうかはわかりませんが(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;

ここで重要なのは、に設定する予定ののを使用することinputAccessoryViewです。UITextFieldUIDatePicker

于 2014-03-31T17:43:53.497 に答える
1

ActionSheetPickerを使用して、ツールバーの[完了]ボタンを取得します。自分で作成する代わりに最適です。

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

于 2015-04-01T18:02:08.723 に答える
0

成功!わかりました。これを行うことはお勧めしませんが、特定のチュートリアルコードで完了ボタンが作成される場所は次のとおりです。

ストーリーボードを見ると、「AddPersonTVC.h」(ストーリーボードの右上にあるクラス)内の「Role」ボックスをクリックすると、「RollPickerTVCell.h」というクラスがポップアップすることがわかります。

RollPickerTVCell.hを調べると、クラス全体が「CoreDataTableViewCell」のサブクラスであることがわかります。

@interface RolePickerTVCell : CoreDataTableViewCell <UIPickerViewDataSource, UIPickerViewDelegate>

クラス「CoreDataTableViewCell.m」を見ると、ついにuibarbuttonitemが見つかりました。

UIBarButtonItem *doneBtn =[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(done:)];
于 2012-05-22T15:10:09.790 に答える
0

テーブルビューセルで作業していて、UITextFieldを使用していない場合(したがって、アクセサリビューを使用しない場合)、私が行ったことは次のとおりです。

このようなテーブルビューセルを作成しました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

これで、テーブルビューでセルを作成するときに行う必要がありました。

  • @selector[完了]ボタンにを指定します。
  • で正しいセルの高さを設定しますheightForRowAtIndexPath
于 2014-05-18T14:08:36.110 に答える