UIPopoverController анимирует, когда всплывает клавиатура - PullRequest
4 голосов
/ 27 июля 2010

Heey,

В моем приложении для iPad у меня есть UIPopoverController с UIViewController, содержащий некоторые текстовые поля.

Когда клавиатура поднимается, Popover становится анимированным. Кто-нибудь знает, как это отключить?

Спасибо

Ответы [ 2 ]

0 голосов
/ 07 апреля 2012

Было бы замечательно, если бы он действительно оживил лучшую часть экрана, я думаю, вы имеете в виду, что он фактически сокращает всплывающее окно, что в большинстве случаев не очень хорошо (что я вижу во время вращения в моем случае).Вы не можете удержать всплывающее окно от всплеска, пока вы не переместите вид.Лучший способ справиться с этим - временно переместить весь основной UIView всего экрана вверх с помощью клавиатуры, на разницу между размером всплывающего окна и тем, насколько сильно это всплывающее окно уменьшится, если вы не переместите его вверх.Вы не можете просто переместить его на размер вашей клавиатуры, потому что всплывающие окна также будут иметь место.Этот код, приведенный ниже, предназначен для поворота клавиатуры, аналогичен коду, когда она впервые вводится.это легко сделать, за исключением того, что когда вы поворачиваете экран, все становится сложнее ...

другими словами, иногда ваш UIView вообще не будет двигаться, иногда он поднимется на хорошие 170 пунктов.

// ----------------- поиск верхней части клавиатуры (также используется для "didRotate") ---- очень удобно, // мне понадобилось несколько часов, чтобы разобратьсяабсолютная всегда работает topOfKeyboard, так что здесь вы идете .-------

//--------------------------------------------------------------------------------
- (void)keyboardWillShow:(NSNotification*)notification
{
NSLog(@"            keyboardWillShow");
UIWindow *keyWindow = [UIApplication sharedApplication].keyWindow;
NSDictionary* info = [notification userInfo];
keyboardRect = [[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];
keyboardRect = [(UIView*)keyWindow convertRect:keyboardRect toView:mainViewController.view];
keyboardIsVisible = TRUE;
topOfKeyboard = keyboardRect.origin.y;

сложная часть находит нижнюю часть всплывающего окна, потому что кажется, что в самом всплывающем окне или convertRect есть код:toView: код, который делает источник ненадежным (если вы пытаетесь «просмотреть» источник после кода «convertRect: toView:»), он хочет перемещаться и находиться в разных местах во время вращения (или одного из своих суперпредставлений), поэтомуbottom calc иногда бывает другим (не предсказуемо) из-за асинхронного процесса вращения различных элементов, возможно, потому, что само всплывающее окно имеет много суперпредставлений вниз во всплывающем окне.(чтобы увидеть проблему в действии с всплывающим окном и, должно иметь всплывающее окно с эффектом клавиатуры, переместите весь вид вверх, затем запишите «origin» и «size» всплывающего окна после «convertRect: toView:» code) ... the origin«Я говорю о происхождении фрейма после того, как он переведен в главное представление (или, по крайней мере, пару просмотров вверх) с кодом« convertRect: toView: »....

обновление: (появляется, если вы перемещаете около 3 суперпредставлений из всплывающего окна, ошибка исчезает ... (этот код ниже был в коде типа "didRotate" ipad. То есть, у всплывающего окна есть несколько суперпредставлений, прежде чем вы сможете получитьк тому, который спроецирован поверх правильного кадра

UIPopoverController, вероятно, должен иметь свойство, происхождение которого прогнозируется после поворота в нем, в виде кода типа "будет вращаться"(из-за проблемы с клавиатурой) вместо «popoverContentSize» (также следует включить popoverContentSize, который был бы без клавиатуры, в качестве другого вариантабле, "... в любом случае, вот как я должен был это сделать, см. код ниже.

//--------------------------------------------------------------------------------
- (void) checkRotation
{
NSLog(@"  ");
NSLog(@"checkRotation");
    if (wasOffset)
    {
        wasOffset = false;
        [UIImageView beginAnimations:nil context:NULL];
        [UIImageView setAnimationDuration:0.2f];            
        CGRect frame = carousel.frame;
        frame.origin.y += offset;
        carousel.frame = frame;
        [UIImageView commitAnimations];

        [popPickerController presentPopoverFromRect:zoneButton.frame inView:[zoneButton superview] permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
    }

    if (popPickerController.popoverVisible)
    {

        if (keyboardIsVisible)
        {
            wasOffset = false;

            [popPickerController presentPopoverFromRect:zoneButton.frame inView:[zoneButton superview]
                    permittedArrowDirections:UIPopoverArrowDirectionAny animated:NO];

            upView3 = [[[popPickerController.contentViewController.view superview] superview] superview]; //hey it works... :o)

//NSLog(@"  ");
//NSLog(@"upView3.frame.origin.x    = %f",upView3.frame.origin.x);
//NSLog(@"upView3.frame.origin.y    = %f",upView3.frame.origin.y);
//NSLog(@"upView3.frame.size.height    = %f",upView3.frame.size.height);
//NSLog(@"upView3.frame.size.width    = %f",upView3.frame.size.width);
//NSLog(@"  ");
            popUpRect.origin.x = upView3.frame.origin.x;
            popUpRect.origin.y = upView3.frame.origin.y;
            popUpRect.size.height = popUpSize.height;
            popUpRect.size.width = popUpSize.width; //you must save the size because the keyboard destroys it before you can use it.  very tricky....

//NSLog(@"  ");
//NSLog(@"popUpRect.origin.x    = %f",popUpRect.origin.x);
//NSLog(@"popUpRect.origin.y    = %f",popUpRect.origin.y);
//NSLog(@"popUpRect.size.height    = %f",popUpRect.size.height);
//NSLog(@"popUpRect.size.width    = %f",popUpRect.size.width);
//NSLog(@"  ");
//NSLog(@"  ");
//NSLog(@"keyboardIsVisible    = %d", keyboardIsVisible);
//NSLog(@"  ");
//NSLog(@"keyboardRect.origin.x     = %f",keyboardRect.origin.x);
//NSLog(@"keyboardRect.origin.y     = %f",keyboardRect.origin.y);
//NSLog(@"keyboardRect.size.height      = %f",keyboardRect.size.height);
//NSLog(@"keyboardRect.size.width       = %f",keyboardRect.size.width);
//NSLog(@"topOfKeyboard             = %f",topOfKeyboard);

                CGFloat bottomOfPicker = popUpRect.origin.y + popUpRect.size.height - amountShadowCanEncroach;
//NSLog(@"  ");
//NSLog(@"bottomOfPicker   = %f",bottomOfPicker);
//NSLog(@"topOfKeyboard    = %f",topOfKeyboard);
//NSLog(@"  ");

            if (bottomOfPicker > topOfKeyboard)
            {
                wasOffset = true;
                offset = bottomOfPicker - topOfKeyboard;
NSLog(@"offset    = %f",offset);

                [UIImageView beginAnimations:nil context:NULL];
                [UIImageView setAnimationDuration:0.2f];            
                CGRect frame = carousel.frame;
                frame.origin.y -= offset;
                carousel.frame = frame;
                [UIImageView commitAnimations];
            }
        }

        [popPickerController presentPopoverFromRect:zoneButton.frame inView:[zoneButton superview] permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
    }
}
and moving the main UIView back
    //-----------------------------------------------------------------------------
        - (void) searchDidEndEditing
        {
        NSLog(@"searchDidEndEditing");
keyboardIsVisible = false;
           if (wasOffset)
            {
                wasOffset = false;
                [UIImageView beginAnimations:nil context:NULL];
                [UIImageView setAnimationDuration:0.2f];            
                CGRect frame = mainView.frame;
                frame.origin.y += offset;
                mainView.frame = frame;
                [UIImageView commitAnimations];

                if (zoneButton.selected)
                    [popPickerController presentPopoverFromRect:zoneButton.frame inView:[zoneButton superview] permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
            }
        }
0 голосов
/ 27 июля 2010

Я не думаю, что вы можете, кроме как сделать поповеры меньше по высоте ... Это сделано так, что когда ваша клавиатура всплывает, ни один из поповер не покрывается ею (таким образом, она сжимается), однако я обнаружил, что это раздражает время от времени, так как он перепутался с представлениями таблиц (не позволяя им прокручивать все время и не изменяя их размер)

...