Вот фрагмент кода из одного из моих проектов. В основном, если отображается всплывающее окно, вы снова представляете всплывающее окно в методе didRotateFromInterfaceOrientation:
, который отправляется в контроллер представления после вращения пользовательского интерфейса. (Методы willRotate...
и willAnimateRotation...
вызываются до того, как произошло вращение, поэтому это неправильное место для вызова метода presentPopover...
.)
- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
{
// if the popover is showing, adjust its position after the re-orientation by presenting it again:
if (self.myPopoverController != nil) // if the popover is showing (replace with your own test if you wish)
{
[self.myPopoverController presentPopoverFromRect:attachmentRect
inView:myView
permittedArrowDirections:UIPopoverArrowDirectionUp
animated:YES];
}
}
В приведенном выше примере self.myPopoverController
- это свойство моего контроллера представления, в котором я сохраняю ссылку на всплывающее окно при его создании. Когда я отклоняю и отклоняю всплывающее окно при нормальных обстоятельствах, я стараюсь установить для этого свойства значение nil
, чтобы проверить его на «non-nil
», чтобы решить, будет ли отображаться всплывающее окно. *
Обратите внимание, однако, что вам не нужно сбрасывать всплывающее окно до того, как произойдет ротация. Просто представьте тот же самый поповер снова. (Здесь пригодится ссылка на поповер.)
В вашем случае, когда всплывающее окно исходит от кнопки на панели инструментов, вы должны использовать что-то вроде следующего:
- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
{
// if the popover is showing, adjust its position after the re-orientation by presenting it again:
if (self.myPopoverController != nil) // if the popover is showing (replace with your own test if you wish)
{
[self.myPopoverController presentPopoverFromBarButtonItem:barButtonItem
permittedArrowDirections:UIPopoverArrowDirectionAny
animated:YES];
}
}