Как показать UIDatePicker над панелью вкладок, ориентированным на ориентацию? - PullRequest
3 голосов
/ 16 июня 2011

Я хочу вставить UIDatePicker, когда мой пользователь нажимает на поле даты просмотра таблицы, точно так же, как в стандартном приложении контактов, когда пользователь нажимает на поле дня рождения. С одной дополнительной деталью убийцы:

Он находится в приложении панели вкладок, и я хочу, чтобы UIDatePicker скользил по панели вкладок. И все еще вращается, когда пользователь помещает свой телефон в ориентацию lanscape.

Я показываю UIDatePicker, чтобы вставить в представление, а затем анимировать его положение:

        [self.view addSubview: self.pickerView];

Когда я это делаю, отображается UIDatePicker, но не распространяется на панель вкладок.

Я также могу добавить его в окно:

        [self.view.window addSubview: self.pickerView];

UIDatePicker правильно скользит по панели вкладок, но при этом не соответствует ориентации.

Единственный полуоприемлемый способ, который я нашел, это вообще обойтись без панели вкладок, используя

        detailViewController.hidesBottomBarWhenPushed = YES;

Но это не то, что я хочу: я хочу панель вкладок в подробном представлении. Я только хочу, чтобы он ушел, выбирая дату. Я не могу поместить UIDatePicker в его собственный контроллер с hidesBottomBarWhenPushed = YES, так как это полностью покрыло бы экран, и я бы предпочел, чтобы детальный вид был частично видимым.

Любое предложение приветствуется.

Вот полный код, который я использую, чтобы показать UIDatePicker, скопированный из некоторого примера кода:

- (void) doPickDate
{
    NSDate *initialDateForPicker = [(ExpenseData*) self.displayedObject displayDate];
    self.pickerView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleTopMargin;
    self.pickerView.datePickerMode = UIDatePickerModeDate;
    self.pickerView.date = initialDateForPicker;

    // check if our date picker is already on screen
    if (self.pickerView.superview == nil)
    {
        [self.view addSubview: self.pickerView];

        // size up the picker view to our screen and compute the start/end frame origin for our slide up animation
        // compute the start frame
        CGRect screenRect = [[UIScreen mainScreen] applicationFrame];
        CGSize pickerSize = [self.pickerView sizeThatFits:CGSizeZero];
        CGRect startRect = CGRectMake(0.0,
                                      screenRect.origin.y + screenRect.size.height,
                                      pickerSize.width, pickerSize.height);
        self.pickerView.frame = startRect;

        // compute the end frame
        CGRect pickerRect = CGRectMake(0.0,
                                       screenRect.origin.y + screenRect.size.height - pickerSize.height,
                                       pickerSize.width,
                                       pickerSize.height);
        // start the slide up animation
        [UIView beginAnimations:nil context:NULL];
        [UIView setAnimationDuration:0.3];

        // we need to perform some post operations after the animation is complete
        [UIView setAnimationDelegate:self];

        self.pickerView.frame = pickerRect;

        // shrink the table vertical size to make room for the date picker
        CGRect newFrame = self.tableView.frame;
        newFrame.size.height -= self.pickerView.frame.size.height - 49 /* tab bar height */;
        self.tableView.frame = newFrame;
        [UIView commitAnimations];

        // add the "Done" button to the nav bar
        self.navigationItem.rightBarButtonItem = self.doneButton;
    }

}

1 Ответ

2 голосов
/ 16 июня 2011

Вы должны установить объект UIDatePicker как inputView этого конкретного текстового поля.Все анимации и презентация будут позаботиться.

Скрытие курсора

Нет способа скрыть курсор.Единственный механизм, который я мог придумать, - это использовать свойство leftView и установить для него метку.

CGRect frame = self.textField.bounds;

UILabel * theLabel = [[[UILabel alloc] initWithFrame:frame] autorelease];
theLabel.userInteractionEnabled = YES;
theLabel.backgroundColor = [UIColor clearColor];

UITapGestureRecognizer * tap = [[[UITapGestureRecognizer alloc] initWithTarget:self
                                                                        action:@selector(tap:)] autorelease];
[theLabel addGestureRecognizer:tap];

self.textField.leftViewMode = UITextFieldViewModeAlways;
self.textField.leftView = theLabel;
self.textField.clipsToBounds = YES;

и обработать нажатие, используя

- (void)tap:(UIGestureRecognizer *)gesture {
    [self.textField becomeFirstResponder];
}

Теперь это не 't для прямоугольной кнопки с закругленными углами, так как курсор мигает в правом углу, независимо от того, какой является рамка метки.Он скрывает курсор для других стилей границ.Вы также можете использовать метку в своих интересах, указав значения в качестве текста.

UILabel * theLabel = textField.leftView;
theLabel.text = @"Appropriate Value from Picker";
...