Встраивание UIDatePicker в UIActionSheet - PullRequest
37 голосов
/ 08 декабря 2008

Я пытаюсь получить UIDatePicker с UIButton для отображения в UIActionSheet. К сожалению, это обрезается, и весь сборщик данных не виден. Я еще даже не пытался добавить UIButton. Может ли кто-нибудь посоветовать правильно настроить весь вид? Я не уверен, как добавить правильные размеры, поскольку в UIActionSheet, похоже, отсутствует конструктор типа -initWithFrame:.

UIActionSheet *menu = [[UIActionSheet alloc] initWithTitle:@"Date Picker" 
                                                  delegate:self
                                         cancelButtonTitle:@"Cancel"
                                    destructiveButtonTitle:nil
                                         otherButtonTitles:nil];

// Add the picker
UIDatePicker *pickerView = [[UIDatePicker alloc] init];
pickerView.datePickerMode = UIDatePickerModeDate;
[menu addSubview:pickerView];
[menu showInView:self.view];

[pickerView release];
[menu release];

Я также пробовал что-то похожее на:

UIActionSheet *menu = [[UIActionSheet alloc] initWithFrame:CGRectMake(200.0, 200.0, 100.0f, 100.0f)];

Координаты, конечно, не реалистичны, но, похоже, они не влияют на положение / размер таблицы UIActionSheet.

Ответы [ 7 ]

44 голосов
/ 09 декабря 2008

Вы можете использовать что-то вроде этого (скорректировать координаты):

    UIActionSheet *menu = [[UIActionSheet alloc] initWithTitle:@"Date Picker" 
                                                  delegate:self
                                         cancelButtonTitle:@"Cancel"
                                    destructiveButtonTitle:nil
                                         otherButtonTitles:nil];

    // Add the picker
    UIDatePicker *pickerView = [[UIDatePicker alloc] init];
    pickerView.datePickerMode = UIDatePickerModeDate;
    [menu addSubview:pickerView];
    [menu showInView:self.view];    
    [menu setBounds:CGRectMake(0,0,320, 500)];

    CGRect pickerRect = pickerView.bounds;
    pickerRect.origin.y = -100;
    pickerView.bounds = pickerRect;

    [pickerView release];
    [menu release];

Но лучше создать полноэкранный вид с помощью UIDatePicker и панели навигации. Пример см. В примере UICatalog -> Pickers из iPhone DevCenter.

18 голосов
/ 07 октября 2009

Попробуйте добавить следующую строку для решения проблемы отключенных кнопок

[menu sendSubviewToBack:pickerView];
17 голосов
/ 28 сентября 2010

Дмитрий отвечает почти правильно. Однако рамка таблицы действий слишком мала, и поэтому прикосновения к нижней части сборщика игнорируются. Я исправил эти проблемы:

UIActionSheet *menu = [[UIActionSheet alloc] initWithTitle:@"Date Picker" 
                                                  delegate:self
                                         cancelButtonTitle:@"Cancel"
                                    destructiveButtonTitle:nil
                                         otherButtonTitles:@"OK",nil];    
// Add the picker
UIDatePicker *pickerView = [[UIDatePicker alloc] init];
pickerView.datePickerMode = UIDatePickerModeTime;
[menu addSubview:pickerView];
[menu showInView:_mainView];        

CGRect menuRect = menu.frame;
CGFloat orgHeight = menuRect.size.height;
menuRect.origin.y -= 214; //height of picker
menuRect.size.height = orgHeight+214;
menu.frame = menuRect;


CGRect pickerRect = pickerView.frame;
pickerRect.origin.y = orgHeight;
pickerView.frame = pickerRect;

[pickerView release];
[menu release];  
8 голосов
/ 20 апреля 2010

Это работает для меня

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" ;
UIActionSheet *actionSheet = [[UIActionSheet alloc] 
                              initWithTitle:[NSString stringWithFormat:@"%@%@", title, NSLocalizedString(@"SelectADateKey", @"")]
                              delegate:self cancelButtonTitle:nil destructiveButtonTitle:nil otherButtonTitles:@"Ok", nil];
[actionSheet showInView:self.view];
UIDatePicker *datePicker = [[[UIDatePicker alloc] init] autorelease];
datePicker.datePickerMode = UIDatePickerModeDate;
[actionSheet addSubview:datePicker];

немного сложно, но это работает!

7 голосов
/ 06 июля 2010

Кнопки вверху, подборщик внизу:

 UIActionSheet *menu = [[UIActionSheet alloc] initWithTitle:@"Date Picker" 
                                                  delegate:self
                                         cancelButtonTitle:@"Cancel"
                                    destructiveButtonTitle:nil
                                         otherButtonTitles:@"OK",nil];    
// Add the picker
UIDatePicker *pickerView = [[UIDatePicker alloc] init];
pickerView.datePickerMode = UIDatePickerModeTime;
[menu addSubview:pickerView];
[menu showInView:_mainView];        

CGRect menuRect = menu.frame;
menuRect.origin.y -= 214;
menuRect.size.height = 300;
menu.frame = menuRect;


CGRect pickerRect = pickerView.frame;
pickerRect.origin.y = 174;
pickerView.frame = pickerRect;

[pickerView release];
[menu release];  
4 голосов
/ 10 августа 2010

Убедитесь, что вы отображаете UIActionSheet в правом представлении, когда находитесь внутри UITabBarController, чтобы избежать проблем с интерактивностью внизу:

[actionSheet showInView:self.parentViewController.tabBarController.view];

3 голосов
/ 04 октября 2011

Возможно, не напрямую отвечая на конкретный вопрос (как настроить UIDatePicker, чтобы соответствовать), но для реализации UIActionSheet, который представляет UIDatePicker (также другие), см. ActionSheetPicker . Из файла Readme:

Легко представить ActionSheet с помощью PickerView, что позволяет пользователю выбирать из ряда неизменных параметров. Основано на альтернативе раскрывающегося списка HTML, найденной в mobilesafari.

Также:

Некоторый код, полученный из сообщения Марсио о переполнении стека [ Добавить UIPickerView и кнопку в листе действий - как? ]

Даже если кто-то не использует код, лучше прочитать его, прежде чем бросать свой собственный.


Обновление:

Эта версия устарела: вместо нее используйте ActionSheetPicker-3.0 .

...