Отмена клавиатуры уменьшает высоту посева

У меня странная проблема на ios 4.3. У меня есть один из моих экранов в ландшафтном режиме, нажатие кнопки представляет popover.My popover имеет панель поиска. Когда бы клавиатура не появлялась, она автоматически подталкивает мой поп-бит. Когда я ухожу клавиатура, popover уменьшает высоту. Это проблема только на ios 4.3.Несмотря на остальную часть ios, мой popover не уменьшает высоту после увольнения клавиатуры.

Ответ 1

Я нашел ответ для этого. Это была ошибка с верхней стрелкой popover.If я использую направление левой стрелки для popover, все работает нормально.

Ответ 2

Ни один из ответов выше не работал у меня. По-видимому, клавиатура масштабирует представление и восстанавливает это масштабирование после уведомления UIKeyboardDidHideNotification, делая метод nowPopoverFromRect бесполезным при применении обработки этого уведомления. Способ, которым я решил это, был отсрочкой последнего вызова следующим образом:

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

Ответ 3

Я ответил на очень похожий вопрос: Контроллер просмотра UIPopoverController получает размер после исчезновения клавиатуры

То, как я обошел это, - это наблюдать, как клавиатура исчезает в контроллере, который управляет UIPopoverController:

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

И затем в -presentSearchPopover снова представите UIPopoverController (это довольно плавный переход):

- (void)presentSearchPopover
{
    self.searchPopoverController.popoverContentSize = CGSizeMake(width, height));

    [self.searchPopoverController presentPopoverFromRect:someRect) inView:self.view permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES];
}

Не забудьте удалить наблюдателя в -dealloc или аналогичном:

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

    [super dealloc];
}

Ответ 4

Я тоже столкнулся с этой проблемой - в частности, popover не возвращался к своему размеру до клавиатуры после того, как удалился от popover. (Попкор будет расти, если пользователь отклонил клавиатуру напрямую или контроллер popover view подал первый ответчик).

К сожалению, я должен использовать направление верхней стрелки для popover из-за макета пользовательского интерфейса. Чтобы решить эту проблему, диспетчер представлений, отвечающий за popover, реализует - (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController. Например:

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

Задайте этот контроллер как делегат popover:

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

Кроме того, мой контроллер popover view устанавливает его свойство contentSizeForViewInPopover в желаемый размер:

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

Когда клавиатура вызывает сжатие popover, она влияет на popover popoverContentSize, а не на контроллер вида contentSizeForViewInPopover. Поэтому reset popoverContentSize в методе делегирования MyController:

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

Ответ 5

Привет После прохождения форума, я не думаю, что это ошибка после игры с размерами кадров много, работая над IOS 4,5,6,7, это то же поведение.

Решение для меня состояло в следующем:

1) Пойдите в конструктора 2) Открытие XIB ViewController, вызывающего проблему (т.е. PopOver). 3) Нажмите, чтобы выбрать VIEW. 4) Снимите флажок "AutoResizeSubviews" 5) При загрузке PopOver в код убедитесь, что вы выполните: 6) Your_Popup_Window.popoverContentSize = Your_ViewController.view.bounds.size;

Надеюсь, это поможет.

С уважением Хайдер Сати

Ответ 6

Вот мое решение:

1. Регистрация для клавиатуры Уведомления (UIKeyboardWillShowNotification, UIKeyboardWillHideNotification)

2. Создайте локальные переменные:

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. В моем методе currentPopover:

- (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. Чем:

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