2010-07-27 5 views
4

Heey,UIPopoverController anime lorsque le clavier saute vers le haut

Dans mon application iPad J'ai un UIPopoverController avec un UIViewController contenant des champs de texte.

Lorsque le clavier apparaît, le Popover est animé. Est-ce que quelqu'un sait comment désactiver cela?

Merci

+0

Avez-vous déjà comprendre cela? Je suis confronté au même problème. – VaporwareWolf

+0

Non, je ne l'ai pas fait. Encore des bugs moi:/ –

+0

Hey, après avoir commencé à partir de zéro, j'ai été en mesure de résoudre ce problème. Il s'avère que j'ai fait ma propre classe UIViewController qui vient d'ajouter une petite fonctionnalité, comme les blocs d'achèvement. Eh bien, apparemment j'avais mis du code dans cette classe pour animer les claviers. Je me sentais un peu bête quand je l'ai réalisé mais je pensais que je ferais un bruit que mes popups ne s'animent plus. La fenêtre popover réelle se déplacera, mais les contrôles resteront dans une position fixe à l'intérieur d'eux. Mon problème est que les champs de texte étaient en animation double. Je pense que nous avons des problèmes différents même s'ils semblent similaires. – VaporwareWolf

Répondre

0

Je ne pense pas que vous pouvez faire les popovers excepter petits en hauteur ... Sa fait comme ça alors quand votre clavier apparaît qu'aucun des popover se couvre par elle (ainsi rétrécit), mais Je l'ai trouvé parfois ennuyeux car il dérangeait les vues de la table (ne pas les rendre capables de faire défiler tout le chemin et de devoir les redimensionner)

0

Ce serait génial si cela animait réellement une meilleure partie de l'écran , Je pense que vous voulez dire que ça rétrécit le popUp qui n'est pas bon pour la plupart (ce que je vois pendant la rotation dans mon cas). Vous ne pouvez pas empêcher le popUp de s'écraser, SAUF si vous déplacez une vue. La meilleure façon de gérer cela est de déplacer temporairement votre UIView principal entier de l'écran entier avec le keyBoard par la différence entre la taille de votre pop-up, et combien ce pop up rétrécirait si vous ne le déplaciez pas. Vous ne pouvez pas simplement le déplacer en fonction de la taille de votre clavier, car les popUp en haut seraient alors également affectés. Ce code ci-dessous est pour quand le clavier a pivoté, code similaire pour quand il est introduit. facile à faire, EXCept pour lorsque vous faites pivoter l'écran, alors les choses deviennent difficiles ...

en d'autres mots, parfois votre UIView ne bouge pas du tout, parfois il passera de 170 points.

// ----------------- trouver le clavier supérieur (également utilisé sur "didRotate") ---- très pratique, // m'a pris des heures pour comprendre sur un absolu toujours du travail topOfKeyboard, donc ici vous allez .-------

//-------------------------------------------------------------------------------- 
- (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; 

la partie la plus délicate est de trouver le fond de PopUp, car il semble y avoir un code dans le menu contextuel lui-même ou le convertRect: toView : code qui fait flamber l'origine, (si vous essayez de "voir" l'origine après un code "convertRect: toView:"), il veut bouger et être à différents endroits pendant la rotation, (ou l'une de ses super vues) calc sort différent plusieurs fois, (pas prévisible) en raison du processus asynchrone de la rotation des différents éléments éventuellement parce que le popUp lui-même a beaucoup de superviews dans le pop-up. (pour voir le problème en action avec pop up et, doit avoir le clavier en effleurant le popup, déplacer l'ensemble de la vue puis connectez les "origine" et "taille" de popUp après le code "convertRect: toView:") ... l'origine "Je parle de l'origine du cadre après qu'il est traduit à la vue principale (ou au moins quelques vues) avec le code" convertRect: toView: "....

mise à jour: (il apparaît si vous déplacez environ 3 superviews depuis le popUp, le flakiness disparaît ... (ce code ci-dessous était dans un type de code ipad "didRotate" .C'est que le popUp a plusieurs superviews avant que vous puissiez arriver à celui qui est projeté sur la bonne image

UIPopoverController devrait probablement avoir une propriété qui a le ou igin qui est prédit après une rotation, dans un type de code "va tourner", (à cause du problème du clavier), au lieu de simplement le "popoverContentSize", (devrait également inclure le popoverContentSize qui aurait été sans le clavier comme une autre variable, ".. de toute façon Voici comment je devais le faire, voir le code ci-dessous.

//-------------------------------------------------------------------------------- 
- (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]; 
      } 
     } 
Questions connexes