2010-06-09 18 views
9

Nella mia app ho 3 UIPopOvers. Appaiono quando l'utente tocca i pulsanti nella barra degli strumenti. Devo far apparire i popover nella posizione corretta quando l'utente ruota iPad se il popover è già aperto (come il -willAnimateRotationToInterfaceOrientation :).UIPopOversamento e cambio di orientamento

Come posso farlo?

Grazie in anticipo!

risposta

6

L'unica soluzione che ho trovato finora è solo la chiusura del popover quando il dispositivo viene ruotato/

+0

Purtroppo non riesco a ottenere nulla per attivare il metodo willRotate del mio controller di visualizzazione, in cui normalmente ignorerei il popover. Avrei pensato che sarebbe stato chiamato, non importa quale. –

+0

Penso anche a questa soluzione che non riesco a farcela. :( –

3

Se è sufficiente utilizzare il metodo presentPopoverFromBarButtonItem per presentare la vostra popover poi il popover si sposterà automaticamente nella posizione corretta per la nuova posizione del pulsante quando il dispositivo viene ruotato.

4

Ecco un frammento di codice da uno dei miei progetti. In sostanza, se il popover viene visualizzato, si presenta nuovamente il popover con il metodo didRotateFromInterfaceOrientation:, che viene inviato al controller di visualizzazione dopo il, la rotazione dell'interfaccia utente ha avuto luogo. (I metodi willRotate... e willAnimateRotation... sono chiamati prima rotazione ha avuto luogo, quindi è posto sbagliato per la chiamata presentPopover... metodo.)

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

In precedenza, self.myPopoverController è una proprietà di mio controller vista in cui Conservo un riferimento al popover quando viene creato. Quando ignoro e scarto il popover in circostanze normali, ho cura di impostare questa proprietà su nil, così posso controllarlo per 'non- nil' ness per decidere se mostrare o meno il popover.

Nota, tuttavia, non è necessario chiudere il popover prima della rotazione. Basta presentare di nuovo lo stesso popover. (Questo è dove mantenere un riferimento al popover viene in aiuto.)

Nel tuo caso, in cui il popover emana da un pulsante della barra degli strumenti, si può usare qualcosa di simile al seguente invece:

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

I' Ho incontrato questo stesso problema un paio di volte. Io di solito solo fare un metodo per mostrare la popover centrato in questo modo:

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

Poi didRotate faccio:

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

questo metterà la popover al centro per qualsiasi orientamento.

10

In iOS 7.0 e successivamente, può essere fatto implementando seguente metodo disponibile in UIPopoverControllerDelegate:

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

Per popovers che sono stati presentati con il metodo presentPopoverFromRect, il controllore popover chiama questo metodo quando cambia l'orientamento interfaccia.

+0

Questo è di gran lunga il modo migliore per farlo dopo iOS7 – logancautrell

+0

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

+0

Questo ha anche risolto un altro bug con 'drawRect' che non veniva chiamato di nuovo su un vista nel mio popover.Grande risposta, dovrebbe essere accettata !!! –

1

All'inizio della modifica dell'orientamento respingere il popover, e dopo il cambiamento di orientamento è completato ancora e cambia presenti la sua posizione sullo schermo:

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

Si prega di aggiungere ulteriori dettagli, piuttosto che semplicemente incollare il codice. – kinshuk4

0

Performing funzione popover:

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

Respingendo popover presentato sull'orientamento cambiando:

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) 
      } 
     } 
    } 

Presentando nuovamente il popover:

func popoverPresentationController(popoverPresentationController: UIPopoverPresentationController, willRepositionPopoverToRect rect: UnsafeMutablePointer<CGRect>, inView view: AutoreleasingUnsafeMutablePointer<UIView?>) { 
    self.presentPopover() 
} 
Problemi correlati