Próbuję zaimplementować przycisk „Gotowe” w UIPickerView podobny do tego na mocy niniejszej linkObjective C wdrożenie UIPickerView z przyciskiem „Gotowe”
spojrzałem w odniesieniu klasy, ale nie mogłem go znaleźć
Dzięki
Próbuję zaimplementować przycisk „Gotowe” w UIPickerView podobny do tego na mocy niniejszej linkObjective C wdrożenie UIPickerView z przyciskiem „Gotowe”
spojrzałem w odniesieniu klasy, ale nie mogłem go znaleźć
Dzięki
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];
}
}
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:)];
Najprostszym sposobem, aby to zrobić, jest modelowanie go w programie Interface Builder. Jest to UIView
zawierający UIToolbar
i UIPickerView
.
Następnie utwórz wylot dla UIView
i podłączyć go.
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;
}];
}
Z jakiej motywu korzysta Twój XCode? – nemesis
@nemesis Myślę, że to jest ten: https://github.com/chriskempson/tomorrow-theme/tree/master/Xcode%204 –
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. :)
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
#import
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.
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:
@selector
dla przycisku Gotowe .heightForRowAtIndexPath
dostać przycisk „Gotowe” w pasku narzędzi używając ActionSheetPicker. Jest świetną alternatywą do samodzielnego budowania.
Odzyskiwanie tego wpisu z takim komentarzem nie jest tak przyjazne ... –
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ć? –
Powinieneś rzucić okiem na @ Paul-Hunter's answer, by utworzyć komponenty Xib. –