2009-07-28 3 views
6

Кто-то отправил этот код в другом вопросе поставить UIDatePicker в UIAlertSheet:UIDatePicker в 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]; 

Я изменил его к этому:

UIActionSheet *menu = [[UIActionSheet alloc] initWithTitle:nil 
                 delegate:nil 
              cancelButtonTitle:@"Done" 
             destructiveButtonTitle:nil 
              otherButtonTitles:nil]; 

    // Add the picker 
    UIDatePicker *pickerView = [[UIDatePicker alloc] init]; 
    pickerView.datePickerMode = UIDatePickerModeCountDownTimer; 
    [menu addSubview:pickerView]; 
    [menu showInView:self.navigationController.tabBarController.view];   
    [menu setBounds:CGRectMake(0,0,320, 516)]; 
    [pickerView setFrame:CGRectMake(0, 85, 320, 216)]; 

Это дает предупредительный лист правильно (игнорируйте делегата nil, это просто для показа). Проблема заключается здесь:

alt text http://hosting-wizards.com/actionsheet.jpg

Как вы можете видеть, выше минуту скроллер, есть проблема наслоения. Я не подтвердил, что это происходит на устройстве. Любые идеи относительно того, почему это происходит?

Другой вопрос: почему селектор setBounds на UIActionSheet имеет размер Y, установленный с таким высоким значением для правильного отображения? Установка размера Y на 480 должна создать полноэкранный режим, если нет? Установка этого значения на ноль делает его почти невидимым.

ПРИМЕЧАНИЕ: Приведенный выше код не позиционирует UIDatePicker в том же месте, что и на картинке, но проблема с расслоением возникает независимо от места размещения UIDatePicker. Проблема расслоения находится только сверху, а не внизу.

ответ

8

Вы избежать проблемы дисплея и получить гораздо лучше выглядит результат, если вы просто поставить UIDatePicker в новом представлении и реализации слайд-вверх сами по себе. Это не так сложно.

  1. Создайте UIView, содержащий средство выбора даты и панель инструментов с кнопкой Готово. (В коде или использовании Interface Builder, не имеет значения.)
  2. Добавить всплывающее представление в качестве подвид вашего основного вида.
  3. Установите кадр мнения, всплывающего окна, так что это от нижней части экрана: frame.origin.y = CGRectGetMaxY(mainView.bounds)
  4. вызовов [UIView beginAnimations:nil context:nil]
  5. Установите кадр, где она должна быть: frame.origin.y -= CGRectGetHeight(popupView.bounds)
  6. вызова [UIView commitAnimations]

(Обратите внимание, что материал настройки рамки является псевдокодом.)

Всё. Сделайте это наоборот, когда вам нужно отклонить представление. Я думаю, что это будет стоить проблемы; приклеивание выбора даты в UIActionSheet выглядит невероятно липким.

1

Вам действительно нужно поставить свой сборщик на лист UIActionSheet? Почему вы не используете свойство inputView из класса UIResponder? Он отображает UIDatePicker (или любое другое представление) автоматически, когда ваш контроль (например, UITextField) становится первым ответчиком. Пример использования inputView с исходным кодом можно найти здесь: Working with pickers.

+0

inputView доступен в iOS 4.0 и выше. Невозможно использовать его, если вы хотите поддерживать 3.1 –

1

попробовать это

[menu sendSubviewToBack: pickerView]; 

, а также переместить подборщика 10 пикселей вниз, как вы видите на скриншоте не aliged на дно, может быть

[pickerView setFrame:CGRectMake(0, 100, 320, 216)]; 
3

Используя шаги benzado по выше, здесь примерно так будет выглядеть ваш код, если вы используете UIView вместо ActionSheet:

int height = 255; 

//create new view 
UIView * newView = [[UIView alloc] initWithFrame:CGRectMake(0, 200, 320, height)]; 
newView.backgroundColor = [UIColor colorWithWhite:1 alpha:1]; 

//add toolbar 
UIToolbar * toolbar = [[UIToolbar alloc] initWithFrame: CGRectMake(0, 0, 320, 40)]; 
toolbar.barStyle = UIBarStyleBlack; 

//add button 
UIBarButtonItem *infoButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Done" style:UIBarButtonItemStyleDone target:self action:nil]; 
toolbar.items = [NSArray arrayWithObjects:infoButtonItem, nil]; 

//add date picker 
UIDatePicker *datePicker = [[UIDatePicker alloc] init]; 
datePicker.datePickerMode = UIDatePickerModeDate; 
datePicker.hidden = NO; 
datePicker.date = [NSDate date]; 
datePicker.frame = CGRectMake(0, 40, 320, 250); 
[datePicker addTarget:self action:nil/*@selector(changeDateInLabel:)*/ forControlEvents:UIControlEventValueChanged]; 
[newView addSubview:datePicker]; 

//add popup view 
[newView addSubview:toolbar]; 
[self.view addSubview:newView]; 

//animate it onto the screen 
CGRect temp = newView.frame; 
temp.origin.y = CGRectGetMaxY(self.view.bounds); 
newView.frame = temp; 
[UIView beginAnimations:nil context:nil]; 
temp.origin.y -= height; 
newView.frame = temp; 
[UIView commitAnimations]; 

Я согласен, это выглядит намного лучше, чем использование ActionSheets, которые предназначены для отображения кнопок, а не сборщиков. Вам все равно нужно добавить свои собственные обработчики действий на кнопку «Готово», и когда пользователь изменит сборщик, но это должно вас начать.

Смежные вопросы