2010-06-09 4 views
9

В моем приложении у меня есть 3 UIPopOvers. Они появляются, когда пользователь нажимает кнопки на панели инструментов. Мне нужно, чтобы popovers отображались в правильном месте, когда пользователь поворачивает iPad, если popover уже открыт (например, -willAnimateRotationToInterfaceOrientation :).UIPopOver и изменение ориентации

Как я могу это сделать?

Заранее благодарен!

ответ

6

Единственное решение, которое я нашел до сих пор просто закрыть поповер, когда устройство вращается/

+0

К сожалению, я не могу получить что-либо, чтобы вызвать метод willRotate моего диспетчера view, где я обычно увольняю popover. Я бы подумал, что будет вызвано, несмотря ни на что. –

+0

Я также думаю об этом решении, я не могу это сделать. :( –

3

Если вы просто используете метод presentPopoverFromBarButtonItem представить свою поповер то поповер автоматически перемещается в правильное положение для новое положение кнопки, когда устройство повернуто.

2

Вы вызываете presentPopoverFromBarButtonItem или FromRect? Вы вносите какие-либо изменения в BarButtonItem для вращения?

В документации Apple указано, что вам необходимо управлять позицией при повороте для FromRect или если вы измените элемент кнопки панели. См. Четвертый абзац в http://developer.apple.com/library/ios/#documentation/uikit/reference/UIPopoverController_class/Reference/Reference.html

4

Вот фрагмент кода из одного из моих проектов. В основном, если всплывающее окно отображается, вы снова представляете popover в методе 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 это свойство моего контроллера вида где Я храню ссылку на popover, когда она создана. Когда я отклоняю и удаляю popover при нормальных обстоятельствах, я позабочусь о том, чтобы установить это свойство в nil, поэтому я могу проверить его на «не nil», чтобы решить, отображается ли popover.

Обратите внимание, что вам не нужно отклонять popover до того, как произойдет поворот. Просто представьте тот же самый popover снова. (Это где держать ссылку на пирог пригодится.)

В вашем случае, когда поповер исходит от кнопки на панели инструментов, можно использовать что-то вроде следующего вместо:

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

Я вы сталкиваетесь с этой проблемой несколько раз. Я обычно просто сделать метод, чтобы показать поповер центрированный как это:

- (void) showPopoverForSize:(CGSize) size center:(CGPoint) center { 
    CGFloat width = size.width; 
    CGFloat height = size.height; 
    CGFloat x = center.x - width/2; 
    CGFloat y = center.y - height/2; 
    CGRect frame = CGRectMake(x, y, width, height); 
    popover.popoverContentSize = frame.size; 

    [popover presentPopoverFromRect:frame inView:self.view permittedArrowDirections:0 animated:YES]; 
} 

Тогда на didRotate я:

- (void) didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation { 
    [super didRotateFromInterfaceOrientation:fromInterfaceOrientation]; 
    if (popover.isPopoverVisible) 
     [self showPopoverForSize:popover.popoverContentSize center:self.view.center]; 
} 

Это поставит поповер в центре для любой ориентации.

10

В iOS 7.0, а позже, это может быть сделано путем реализации следующего доступного метода в UIPopoverControllerDelegate:

(void)popoverController:(UIPopoverController *)popoverController willRepositionPopoverToRect:(inout CGRect *)rect inView:(inout UIView **)view

Для Popovers, которые были представлены с использованием методаpresentPopoverFromRect, контроллер поповера вызывает этот метод, когда изменяется ориентация интерфейса.

+0

Это, безусловно, лучший способ сделать это после iOS7. – logancautrell

+0

'CGRect frame = self.myView.frame; * rect = frame;' – logancautrell

+0

Это даже исправило еще одну ошибку с 'drawRect', которая не была снова вызвана на view in my popover. Отличный ответ, должен быть признан !!! –

1

В начале смены ориентации отклонить поповер, и после того, как изменение ориентации завершается его снова и он меняет настоящее его положение на экране:

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { 
      [_popover dismissPopoverAnimated:YES]; 
     } 
    } 

    - (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation 
    { 
     if (_popover) { 
      [_popover presentPopoverFromRect:frameRect 
                 inView:self.view 
            permittedArrowDirections:UIPopoverArrowDirectionUp 
                animated:YES]; 
     }  
    } 
+0

Пожалуйста, добавьте более подробную информацию, вместо того, чтобы просто вставлять код. – kinshuk4

0

Выполнение поповер функции:

func presentPopover() { 
    self.popoverFlag = true 
    //Presenting PopOver code goes here 
    // ... 
} 

Dismissing представлено поповер на изменяющейся ориентации:

override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) { 

     if self.isKindOfClass(ViewController) && self.popoverFlag{ 
      guard self.presentedViewController != nil else { return } 
      dispatch_async(dispatch_get_main_queue()) { 
       self.presentedViewController!.dismissViewControllerAnimated(true, completion: nil) 
      } 
     } 
    } 

Представляем popover еще раз:

func popoverPresentationController(popoverPresentationController: UIPopoverPresentationController, willRepositionPopoverToRect rect: UnsafeMutablePointer<CGRect>, inView view: AutoreleasingUnsafeMutablePointer<UIView?>) { 
    self.presentPopover() 
} 
Смежные вопросы