2012-05-22 14 views

Odpowiedz

6

dodałem UIToolbar z UIBarButtonItem na przycisk „Gotowe” w moim xib z ramą ustawiony tak, że nie jest początkowo widoczny (wartość y równa wysokości widoku macierzystego).

Za każdym razem, gdy użytkownik uzyskuje dostęp do selektora, zmieniłem ramkę (wartość y) UIDatePicker i UIToolbar z animacją, aby przesuwać się wraz z selektorem u dołu ekranu, podobnie jak na klawiaturze.

Sprawdź mój kod poniżej.

- (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]; 
    } 
} 
+0

Powinieneś rzucić okiem na @ Paul-Hunter's answer, by utworzyć komponenty Xib. –

0

Sukces! Ok, nigdy bym tego nie zasugerował, ale tutaj jest tworzony przycisk Gotowe w twoim kodzie:

Patrząc na scenorys, widzimy to po kliknięciu pola "Rola" wewnątrz "AddPersonTVC.h" (klasa w prawym górnym rogu storyboard), to wyskakuje klasy o nazwie „RollPickerTVCell.h”

Patrząc RollPickerTVCell.h, zauważymy, że cała klasa jest podklasą „CoreDataTableViewCell”

@interface RolePickerTVCell : CoreDataTableViewCell <UIPickerViewDataSource, UIPickerViewDelegate> 

Patrząc na klasę "CoreDataTableViewCell.m", w końcu znajdujemy nasz uibarbuttonitem!

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

Najprostszym sposobem, aby to zrobić, jest modelowanie go w programie Interface Builder. Jest to UIView zawierający UIToolbar i UIPickerView.

enter image description here

Następnie utwórz wylot dla UIView i podłączyć go.

enter image description here

Jeśli następnie mają UITextField można przypisać swój własny pogląd na jego inputView nieruchomości.

[self.textField setInputView:self.customPicker]; 

Ewentualnie można dodać próbnika do widoku głównego ...

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

..., a następnie użyć tej metody, aby pokazać lub ukryć próbnika.

- (void)setPickerHidden:(BOOL)hidden 
{ 
    CGAffineTransform transform = hidden ? CGAffineTransformIdentity : CGAffineTransformMakeTranslation(0, -CGRectGetHeight(self.customPicker.frame)); 

    [UIView animateWithDuration:0.3 animations:^{ 
     self.customPicker.transform = transform; 
    }]; 
} 
+0

Z jakiej motywu korzysta Twój XCode? – nemesis

+0

@nemesis Myślę, że to jest ten: https://github.com/chriskempson/tomorrow-theme/tree/master/Xcode%204 –

2

utworzyć klasę niestandardową, to obsługuje wiele Orientacja:

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

Korzystanie z niestandardowego widoku w kontrolerze widoku:

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

Nadzieja to pomaga. :)

+0

Próbowałem twojej metody. Stworzyłem niestandardową klasę i zaimportowałem plik .h w nowej klasie. Ale mówi nieokreślony selektor identyfikatora. czy robię coś źle? – aVC

+0

#import #import "DateTimePicker.h" @interface ViewController: UIViewController { DateTimePicker * dateTimePicker; } – thanhbinh84

1

Istnieje bardziej eleganckie rozwiązanie. Nie jestem pewien, czy to ostatnie (jak iOS7), ale działa to dla mnie wspaniale.

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

a następnie w czasie realizacji ...

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

Kluczem tutaj jest użycie inputAccessoryView z UITextField że planujesz ustawić UIDatePicker na.

0

W przypadku, gdy pracujemy nad Table View komórki i nie używasz UITextField (stąd nie będzie przy użyciu widoku akcesoria), oto co zrobiłem:

I stworzył komórkę widok tabeli o nazwie GWDatePickerCell który wygląda tak (nie ma plików .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 

Teraz wszystko, co musiałem zrobić podczas tworzenia komórek w tabeli Widok:

  • Określ @selector dla przycisku Gotowe .
  • Ustaw prawidłową wysokość komórek w heightForRowAtIndexPath
1

dostać przycisk „Gotowe” w pasku narzędzi używając ActionSheetPicker. Jest świetną alternatywą do samodzielnego budowania.

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

+0

Odzyskiwanie tego wpisu z takim komentarzem nie jest tak przyjazne ... –

+2

Pomóż mi zrozumieć, jak to nie jest przyjazne? Natrafiłem na to pytanie szukając odpowiedzi i uznałem, że najlepszą odpowiedzią dla mnie było skorzystanie z biblioteki. Dlaczego ktoś inny nie chciałby tego wiedzieć? –