Domanda

Nella mia app ho 3 UIPopOvers. Essi appaiono quando l'utente tocca i pulsanti nella barra degli strumenti. Ho bisogno di fare le popovers appaiono nella posizione corretta quando ruota utente iPad se la popover è già aperto (come il -willAnimateRotationToInterfaceOrientation:).

Come posso fare?

Grazie in anticipo!

È stato utile?

Soluzione 2

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

Altri suggerimenti

In iOS 7.0 e versioni successive, può essere fatto mediante l'attuazione seguente metodo disponibile in UIPopoverControllerDelegate :

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

Per popovers che sono stati presentati utilizzando il presentPopoverFromRect metodo, il controller popover chiama questo metodo quando l'orientamento dell'interfaccia modifiche.

Ecco un frammento di codice da uno dei miei progetti. In sostanza, se il popover mostra, si presentano nuovamente il popover nel metodo didRotateFromInterfaceOrientation:, che viene inviato al controller della vista luogo dopo rotazione interfaccia utente ha compiuto. (I metodi willRotate... e willAnimateRotation... sono chiamati prima la rotazione ha avuto luogo, quindi è il posto sbagliato per la chiamata al metodo 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];
  }    
}

In quanto sopra, self.myPopoverController è una proprietà del mio controller della vista, dove posso conservare un riferimento al popover al momento della creazione. Quando ho respingere e scartare il popover in circostanze normali, mi prendo cura di impostare questa proprietà a nil, in modo da poter controllare la presenza di 'non-nil'ness per decidere se o non viene visualizzato il popover.

Si noti, tuttavia, che non è necessario per chiudere la popover prima che la rotazione avviene. Basta presentare di nuovo la stessa popover. (Questo è dove mantenere un riferimento al popover viene in aiuto.)

Nel tuo caso, in cui i emana popover 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];
  }    
}

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

Stai chiamando presentPopoverFromBarButtonItem o FromRect? State facendo modifiche al BarButtonItem sulla rotazione?

la documentazione di Apple afferma esplicitamente che serve per gestire la posizione a rotazione per FromRect o se si modifica l'elemento pulsante della barra. Vedi, quarto comma, in http: // sviluppatore. apple.com/library/ios/#documentation/uikit/reference/UIPopoverController_class/Reference/Reference.html

Ho eseguito in 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, il 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.

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

Esecuzione della funzione di popover:

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

che respinge presentato popover a cambiare orientamento:

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

Presentazione nuovo popover:

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

Si dovrebbe utilizzare il metodo UIPopoverPresentationControllerDelegate:

func popoverPresentationController(_ popoverPresentationController: UIPopoverPresentationController, willRepositionPopoverTo rect: UnsafeMutablePointer<CGRect>, in view: AutoreleasingUnsafeMutablePointer<UIView>)

e aggiornare il valore rect.

La risposta di See @Hugo Alonso qui

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top