Анимированный UIPickerView не вращается в ландшафтном режиме - PullRequest
2 голосов
/ 15 июля 2011

У меня есть UIPickerView, который анимирует вверх и вниз в UITableViewController. Я адаптировал пример от Apple (DateCell). UIPickerView создается программно, без перьев.

В портретном режиме все выглядит хорошо. Когда я вращаю симулятор (я не тестировал на устройстве), UITableView вращается хорошо, но сборщик остается, где бы он ни был. Я читал множество тем на эту тему, и у многих разработчиков, похоже, есть проблемы со сборщиками, которые ведут себя странно в ландшафтном режиме, но по крайней мере их сборщики вращаются. Я сделал подкласс UIPickerView, как описано в этой ссылке: http://www.llamagraphics.com/developer/using-uidatepicker-landscape-mode,, но это не помогло с проблемой поворота.

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

Я подозреваю, что проблема в том, что я использую средство выбора внутри UITableViewController, и поэтому я добавляю его как подпредставление self.view.window. Если я попытаюсь добавить средство выбора как подпредставление self.view, появится только белая рамка (без средства выбора).

Есть предложения?

Код инициализации в подклассе UITableViewController:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (self.pickerView.superview == nil)
    {
        //Initialization code 
        UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];
        CGRect initFrame = orientation == UIInterfaceOrientationPortrait ? CGRectMake(0, 0, 320, 200) : CGRectMake(0, 0, 480, 160);

        self.pickerView = [[RotatingUIPickerView alloc] initWithFrame:initFrame];
        [self.pickerView setDelegate:self];
        [self.pickerView setShowsSelectionIndicator:YES];
        [self.pickerView setAutoresizingMask:UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleTopMargin];

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

        // 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 setFrame: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 setFrame:pickerRect];

        [UIView commitAnimations];
    }
}

Реализация подкласса UIPicker, как описано по ссылке выше:

- (id)initWithFrame:(CGRect)frame 
{
    if (self == [super initWithFrame:frame]) 
    {
        for (UIView * subview in self.subviews) 
        {
            [subview setFrame:self.bounds];
        }
    }
    return self;
}

- (id) initWithCoder:(NSCoder *)aDecoder 
{
    if (self == [super initWithCoder: aDecoder]) 
    {
        for (UIView * subview in self.subviews) 
        {
            [subview setFrame:self.bounds];
        }
    }
    return self;
}

1 Ответ

4 голосов
/ 15 июля 2011

Выполнив:

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

, вы добавляете pickerView как подпредставление вашего UIWindow.Я не знаю, как можно повернуть основную UIWindow, если это возможно.

Когда вы добавляете pickerView к представлению

 [self.view addSubview:self.pickerView];

, у вас возникают проблемы из-запредставление UITableView.

Я предлагаю добавить pickerView к некоторому промежуточному элементу UIView, добавленному как подпредставление к UIWindow и к которому вы добавляете UITableView.С этим промежуточным UIView также будет связан UIViewController, так что shouldAutorotateToInterfaceOrientation может вернуть правильное значение для работы автоматического поворота.

...