Нижний всплывающий UIPicker? - PullRequest
3 голосов
/ 09 августа 2010

Является ли UIPicker всплывающим из нижней части экрана, когда действие называется просто базовым UIPickerView, который определенным образом координируется? (Как UIActionSheet?) Как бы я это реализовал?

Ответы [ 4 ]

4 голосов
/ 10 августа 2010

Вот код анимации, который я использую:

- (void)animateDatePicker:(BOOL)show {
    CGRect screenRect = self.frame;
    CGSize pickerSize = [self.datePickerView sizeThatFits:CGSizeZero];
    CGRect startRect = CGRectMake(0.0,
                                  screenRect.origin.y + screenRect.size.height,
                                  pickerSize.width, pickerSize.height);

    CGRect pickerRect = CGRectMake(0.0,
                                   screenRect.origin.y + screenRect.size.height - pickerSize.height,
                                   pickerSize.width,
                                   pickerSize.height);

    self.datePickerView.frame = pickerRect;
    self.backgroundColor = UIColorMakeRGBA( 64, 64, 64, 0.7f - (int)show * 0.7f );

    if ( show ) {
        self.datePickerView.frame = startRect;
        [self.parentViewController addSubviewToWindow:self];
    }

    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:0.3f];
    [UIView setAnimationDelegate:self];

    self.backgroundColor = UIColorMakeRGBA( 64, 64, 64, 0.0f + (int)show * 0.7f );

    if ( show ) {
        self.datePickerView.frame = pickerRect;
    } else {
        [UIView setAnimationDidStopSelector:@selector(slideDownDidStop)];
        self.datePickerView.frame = startRect;
    }

    [UIView commitAnimations];  
}

datePickerView - это представление, которое содержит DatePicker:

self.datePickerView = [[UIView alloc] initWithFrame:CGRectMake(0.0, 174.0, 320.0, 286.0)];
self.datePicker = [[UIDatePicker alloc] initWithFrame:CGRectMake(0.0, 70.0, 320.0, 216.0)];
[self.datePicker setDatePickerMode:UIDatePickerModeDate];
[self.datePicker addTarget:self action:@selector(pickerValueChanged:) forControlEvents:UIControlEventValueChanged];
[self.datePickerView addSubview:self.datePicker];

parentViewController должен реализовывать метод addSubviewToWindow:

- (void)addSubviewToWindow:(UIView *)addView {
    [self.view addSubview:addView];
}

UIColorMakeRGBA:

#define UIColorMakeRGBA(nRed, nGreen, nBlue, nAlpha) [UIColor colorWithRed:(nRed)/255.0f green:(nGreen)/255.0f blue:(nBlue)/255.0f alpha:nAlpha]

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

Итак, просто подведем итог - у вас есть MyViewController, который имеет

MyDatePickerView *myDatePicker;

поле.

MyDatePickerView - это пользовательский класс, имеющий поле UIDatePicker * datePicker, MyViewController * parentViewController и метод animateDatePicker.

Когда вы выполняете какое-то действие с MyViewController (например, UIControlEventTouchUpInside для какой-то кнопки), вы должны вызвать

[myDatePicker animateDatePicker:YES];

Пожалуйста, дайте мне знать, если у вас есть вопросы.

UPDATE: Вот небольшой пример .

0 голосов
/ 31 августа 2010

У меня та же проблема, что и у Роба ... я могу сделать всплывающее окно UIPicker ... но оно заполняет весь экран ... я хочу, чтобы всплывающее окно только всплыло ... Мэтт говорит, что вам не нужнозаставить вид занять весь кадр ... изменение размера вдоль не работает ... как сделать так, чтобы всплывающее окно всплыло?я должен был все еще видеть часть родительского представления ... очень как сафари на выпадающих списках ручки iphone.

0 голосов
/ 09 августа 2010

Что вы подразумеваете под "UIPicker, который появляется из нижней части экрана, когда вызывается действие"?

Если вы хотите сделать примерно то, что делает приложение Facebook, посмотрите вверх Three20 - это их библиотека пользовательского интерфейса с открытым исходным кодом (нет гарантии, что компонент, который они используют, есть; я не проверял).

0 голосов
/ 09 августа 2010

Поместите UIPickerView в новый класс UIViewController (назовем его PopupUIPicker), а затем отобразите этот View Controller с помощью:

PopupUIPicker *pickerController = [[[PopupUIPicker alloc] init] autorelease];
[currentViewController presentModalViewController:pickerController animated:YES];

Где currentViewController - это View Controller, на котором вы хотите его отобразить. Чтобы отклонить это:

[currentViewController dismissModalViewControllerAnimated:YES];

Анимация по умолчанию - скользить снизу вверх. Вы можете изменить это как:

pickerController.modalTransitionStyle = UIModalTransitionStylePartialCurl;
...