Я пытаюсь получить 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.





Вы можете использовать что-то вроде этого (настройте координаты):
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.
Я попробовал этот подход, он выглядел нормально, но я обнаружил, что кнопки на UIActionSheet были отключены. Есть идеи?
Попробуйте добавить следующую строку, чтобы решить проблему с отключенными кнопками
[menu sendSubviewToBack:pickerView];
Это работает для меня
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];
немного сложно, но это работает!
добавление переносов строки в заголовок - это просто хакерство, но что бы ни плавало на вашей лодке, я думаю
Кнопки вверху, средство выбора внизу:
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];
Убедитесь, что вы показываете UIActionSheet в правильном представлении внутри UITabBarController, чтобы избежать проблем с интерактивностью внизу:
[actionSheet showInView:self.parentViewController.tabBarController.view];
Должно быть [actionSheet showFromTabBar: self.parentViewController.tabBarController.ta bBar]
Ответ Дмитрия - правильный почти. Однако рамка таблицы действий слишком мала, поэтому касания в нижней части окна выбора игнорируются. Я исправил эти проблемы:
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];
У меня это все еще не работает. Я подозреваю, что отчасти моя проблема в том, что в моем приложении есть панель вкладок. Если я сдвигаю menu.frame еще на 44 пикселя (высота панели вкладок), средство выбора даты работает безупречно, но в нижней части меню есть зазор в 44 пикселя.
В каком виде вы показываете ActionSheet, т.е. какой у вас _mainView? Не отображайте ActionSheet в представлении содержимого, отображайте его в представлении, содержащем представление содержимого и панель вкладок. Если вы используете контроллер навигации, вы можете сделать что-то вроде [menu showInView:self.navigationController.view].
У меня возникла не отвечающая зона внизу экрана, но размещение [меню sendSubviewToBack: pickerView]; в самом конце все исправляет, по крайней мере у меня на iOS5
Это потрясающий ответ!
Возможно, не отвечая напрямую на конкретный вопрос (как подобрать UIDatePicker), но для реализации UIActionSheet, который представляет UIDatePicker (а также другие), см. ActionSheetPicker. Из этого файла Readme:
Easily present an ActionSheet with a PickerView, allowing user to select from a number of immutable options. Based on the HTML drop-down alternative found in mobilesafari.
Также:
Some code derived from marcio's post on Stack Overflow [ Add UIPickerView & a Button in Action sheet - How? ]
Даже если вы не используете код, его полезно прочитать, прежде чем вы откроете свой собственный.
Эта версия устарела: используйте вместо нее ActionSheetPicker-3.0.
Это хороший немецкий пример.