presentPopoverFromRect отображает всплывающее окно сбоку при вращении

-У меня есть UIView.
-Этот UIView имеет UIButton, при нажатии которого появляется UIAlertView.
-В пределах этого UIAlertView у меня есть еще один UIButton, который при нажатии вызывает метод buttonClicked:
-Внутри этого метода buttonClicked:, Я вызываю presentPopoverFromRect с пользовательским представлением внутри. (hourKeyboard - это пользовательский вид)

-(void)buttonClicked:(id)sender
{
    if(self.hourKeyboard==nil)
    {
        self.hourKeyboard = [[HourKeyboardViewController alloc] init];
        self.hourKeyboardPopover = [[UIPopoverController alloc] initWithContentViewController:self.hourKeyboard];
    }

    [self.hourKeyboardPopover presentPopoverFromRect:[sender bounds] inView:sender permittedArrowDirections:UIPopoverArrowDirectionLeft animated:YES];
}

В обычном портретном режиме это работает отлично. Всплывающее окно появляется справа от кнопки со стрелкой, правильно указывающей влево на кнопку.

Возникают 2 проблемы:
1) Пока это всплывающее окно видно, при повороте экрана всплывающее окно поворачивается немного неправильно (оно не меняет свою собственную позицию x и y)
2) Если всплывающее окно не показывают. Если вы повернете экран, а затем вызовете «buttonClicked», всплывающее окно появится, однако оно будет отображаться сбоку над кнопкой со стрелкой, указывающей «вниз» на кнопку (технически слева по отношению к боковому виду всплывающего окна). Если вы отклоните его, повернете экран, а затем вызовете «buttonClicked», всплывающее окно теперь отображается вверх ногами, а кнопка указывает «вправо» на кнопку (опять же, технически влево по отношению к боковому виду всплывающего окна)! Повторите, чтобы снова сделать это боком, а затем снова правой стороной вверх.

-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

Мое мышление:

1) Я считаю, что могу просто изменить положение x и y, однако я также читал, что вы должны отклонить всплывающее окно и представить его снова при вращении. Я посмотрю, смогу ли я заставить работать первый, однако меня больше беспокоит вторая проблема.

2) Я понятия не имею, как решить эту проблему с вращением. Кажется, что когда вы поворачиваетесь в ландшафт, всплывающее окно не видно. И затем вы вызываете presentPopoverFromRect, всплывающее окно создается с iPad, который по ошибке думает, что он все еще находится в портретной ориентации. Это поведение, которое он дает, однако я не уверен, как сделать так, чтобы iPad не совершал эту ошибку.

-=-=-=-=-=-=-=-=-=

Еще раз спасибо за любую помощь, которую вы можете предоставить!

-=-=-

Небольшое обновление:
1) Было легко убрать всплывающее окно из основного вида при повороте. И это, кажется, общий способ, которым все решают эту проблему.

2) Попытка различных вещей, таких как изменение кадра, использование CGAffineTransformMakeRotation и других... но пока безуспешно

-=-=-

Другое обновление:

2) После долгих испытаний кажется, что это прямая проблема с UIAlertView. Если я помещу представление в UIAlertView (в настоящее время), AlertView не сообщает всплывающему меню, что экран повернут... тем самым создавая проблему

Похоже, единственный способ исправить это — полностью удалить UIAlertView. Вместо того, чтобы показывать UIAlertView, я отключу различные фоновые представления вручную (как это делал Alert View), а затем покажу пользовательский UIView, который чертовски похож на AlertView. Оттуда я смогу показать всплывающее окно без каких-либо проблем. Я дам знать, как это получается.

-=-=-=-=-=-=-=-

Окончательное решение:

В итоге я просто создал свое собственное представление, и это представление имитировало UIAlertView. Затем, когда я создал всплывающее окно, я поместил его в корневой контроллер представления. Работало НАМНОГО лучше, но требовало больше работы, так как мне пришлось вручную создавать собственное представление вместо готового UIAlertView. В любом случае, по-видимому, UIAlertView не может сообщить подвиду UIPopoverover, в каком повороте он находится.


person Highrule    schedule 07.05.2012    source источник


Ответы (1)


закрыть всплывающее окно в willRotateToInterfaceOrientation и снова показать его в didRotateFromInterfaceOrientation.

Работает без проблем.

РЕДАКТИРОВАТЬ: Извините, я неправильно понял вашу вторую проблему.

Если какая-то часть вашей иерархии представлений отображается с плохой ориентацией, вероятно, в одном из ваших контроллеров отсутствует метод shouldAutorotateToInterfaceOrientation.

person Sulthan    schedule 07.05.2012
comment
Да, это то, что я делаю, чтобы решить проблему 1. Однако проблема 2 заключается в том, что когда я снова пытаюсь показать всплывающее окно, оно теперь отображается сбоку (на 90 градусов от того, что должно быть). - person Highrule; 07.05.2012
comment
Я разместил свое окончательное решение в своем основном посте (сделал свое собственное мнение, чтобы имитировать uialertview), но информация в этом посте была моим общим размышлением о том, почему существует проблема. - person Highrule; 08.06.2012