la démission du keyboard réduit la hauteur du popover

J'ai un problème étrange sur ios 4.3.J'ai un de mon écran en mode paysage, un clic de button présente un popover.My popover a une barre de search. Chaque fois que le keyboard apparaît, il pousse automatiquement mon popover bit vers le haut.Quand je me résigne le keyboard, popover réduit en hauteur.Ceci est le problème uniquement sur ios 4.3.While dans le rest de l'ios, mon popover ne se réduit pas en hauteur après le renvoi du keyboard.

Aucune des réponses ci-dessus n'a fonctionné pour moi. Apparemment, le keyboard met à l'échelle la vue et restaure cette mise à l'échelle après la notification UIKeyboardDidHideNotification, rendant la méthode presentPopoverFromRect inutile lorsqu'elle est appliquée à la gestion de cette notification. La façon dont je l'ai résolu était en retardant le dernier appel comme suit:

- (void)viewDidLoad { [super viewDidLoad]; popup = nil; //my ViewController with UITextField popover = nil; //my UIPopoverController NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; [nc addObserver:self selector:@selector(resizePopup:) name:UIKeyboardDidHideNotification object:nil]; } - (void)doDelayedResize { [popover presentPopoverFromRect:myButton.bounds inView:myButton permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES]; } - (void)resizePopup:(NSNotification*)note { [self performSelector:@selector(doDelayedResize) withObject:nil afterDelay:0.01]; } 

J'ai répondu à une question très similaire ici: le controller de vue de UIPopoverController est redimensionné après la disparition du keyboard

La façon dont je l'ai contourné était d'observer la disparition du keyboard dans le controller qui contrôle le UIPopoverController:

 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(presentSearchPopover) name:UIKeyboardDidHideNotification object:nil]; 

Et puis dans -presentSearchPopover , présentez le UIPopoverController à nouveau (c'est une transition assez transparente):

 - (void)presentSearchPopover { self.searchPopoverController.popoverContentSize = CGSizeMake(width, height)); [self.searchPopoverController presentPopoverFromRect:someRect) inView:self.view permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES]; } 

Ne pas oublier d'enlever l'observateur dans -dealloc ou similaire:

 - (void)dealloc { [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardDidHideNotification object:nil]; [super dealloc]; } 

J'ai trouvé une réponse pour cela. C'était un bug avec la flèche du haut de popover.Si j'utilise la direction de la flèche vers la gauche pour popover, tout fonctionne bien.

Je suis également tombé sur ce problème – en particulier, le Popover ne repassait pas à sa taille d'avant le keyboard après avoir tapé loin de la Popover. (Le popover repousserait si l'user rejette directement le keyboard ou si le controller de vue du survivant a démissionné du premier répondeur).

Malheureusement, je dois utiliser la direction de la flèche du haut pour le popover en raison de la disposition de l'interface user. Pour résoudre ce problème, le controller de vue responsable du popover implémente - (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController . Par exemple:

 @interface MyController : UIViewController <UIPopoverControllerDelegate> { // ... } //... @end 

Définissez ce controller comme le délégué du survivant:

 MyPopoverViewController *popoverVC = [[MyPopoverViewController alloc] init]; UIPopoverController *myPopover = [[UIPopoverController alloc] initWithContentViewController:popoverVC]; myPopover.delegate = self; // Hang on to popoverVC, myPopover or release them as desired... 

En outre, le controller de vue de mon popover définit sa propriété contentSizeForViewInPopover sur la taille souhaitée:

 @implementation MyPopoverViewController - (id)init { self = [super init]; if (self) { // ... self.contentSizeForViewInPopover = CGSizeMake(320, 400); // desired size } return self; } 

Lorsque le keyboard réduit le popover, il affecte le popoverContentSize du popoverContentSize et non le popoverContentSize son controller de contentSizeForViewInPopover . Par conséquent, réinitialisez popoverContentSize dans la méthode déléguée de MyController:

 - (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController { // Check if popoverController is valid, the popover you want, etc popoverController.popoverContentSize = popoverController.contentViewController.contentSizeForViewInPopover; } 

Voici ma solution:

1. Enregistrez-vous pour les notifications keyboard ( UIKeyboardWillShowNotification, UIKeyboardWillHideNotification )

2. Créez des variables locales:

 CGSize _currentPopoverContentSize; //if you want to have custom size for popover UIView *_currentPopoverSender; //to remember from wich view you will present popover BOOL _keyboardIsShown; //enable in keyboardWillShow, and disable in keyboardWillHide 

3. Dans ma méthode actuellePopover:

 - (void)presentPopoverControllerWithSize:(CGSize)size fromView:(UIView *)sender{ MyController *controller = [[[MyController alloc] init] autorelease]; if (self.popover) { [_popover release]; _popover = nil; } _popover = [[UIPopoverController alloc] initWithContentViewController:controller]; _popover.popoverContentSize = size; _popover.delegate = self; //checking if keyboard is shown - if NO, than present popover, if YES - just `resignFirstResponder` for your _`activeTextField`(you can set it in -textFieldDidBeginEditing: and nullify in -textFieldDidEndEditing:) if (!_keyboardIsShown) { [_popover presentPopoverFromRect:[sender bounds] inView:sender permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES]; } else { [_activeTextField resignFirstResponder]; } _currentPopoverContentSize = size; _currentPopoverSender = sender; } 

4. Que:

 - (void)keyboardWillBeHidden:(NSNotification*)aNotification{ [UIView animateWithDuration:0.3 animations:^{ //do some stuff [self.scrollView setContentSize:_scrollViewContentSize]; } completion:^(BOOL finished) { if (_popover && _currentPopoverSender) { [_popover presentPopoverFromRect:[_currentPopoverSender bounds] inView:_currentPopoverSender permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES]; } }]; _keyboardIsShown = NO; } 

Salut Après avoir traversé le forum, je ne pense pas que ce soit un bug après avoir beaucoup joué avec les tailles d'image, en travaillant sur IOS 4,5,6,7 c'est le même comportement.

La solution pour moi était de:

1) Allez dans le concepteur en 2) ouvrant le XIB ViewController qui cause le problème (c'est-à-dire le Popover). 3) Cliquez pour sélectionner c'est VUE. 4) Décochez "AutoResizeSubviews" 5) Lorsque vous chargez le PopOver dans le code, assurez-vous de: 6) Your_Popup_Window.popoverContentSize = Your_ViewController.view.bounds.size;

J'espère que ça aide.

Cordialement Heider Sati