Domanda

Quando passo dalla visualizzazione verticale a quella orizzontale (e viceversa) sull'iPad, la posizione della visualizzazione popover risulta confusa.Ecco come calcolo il frame della mia visualizzazione popover:

aRect = self.myElement.frame;
aRect.origin.x += aRect.size.width;

[aPopOver presentPopoverFromRect:aRect inView:self.myElement.superview permittedArrowDirections:UIPopoverArrowDirectionRight animated:YES];

Per favore dimmi cosa c'è che non va qui?

È stato utile?

Soluzione

ok, ho notato qualcosa di strano codice.

qualsiasi motivo si sta aggiungendo la dimensione del bersaglio sulla origine della posizione x di aRect? aRect.origin.x + = aRect.size.width;

im supponendo che si desidera che questo sia l'angolo in alto a destra ....

È possibile rimuovere il commento il codice nel file .m e renderlo in questo modo:

// Override to allow orientations other than the default portrait orientation.
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
     Return YES; // for supported orientations
    //otherwise return (interfaceOrientation == UIInterfaceOrientationLandscape); if you want only landscape mode.
}

O quello che vorrei fare nella vostra situazione, se si vuole il layout tuoi subviews è utilizzare il didRotateFromIntferfaceOrientation: in questo modo:

(void) didRotateFromInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    [self layoutSubviews];
}

e anche layoutSubviews

- (void)layoutSubviews
{
    NSLog(@"layoutSubviews called");

    ...recalc rects etc based on the new self.view.bounds...
}

Funziona in questo modo.

PK

Altri suggerimenti

Dal Documentazione UIPopoverController:(sottolineatura mia)

Se l'utente ruota il dispositivo mentre è il popover è visibile, il popover il controller nasconde il popover e poi lo mostra di nuovo alla fine del rotazione.Il controller popover Tenta di posizionare il popover in modo appropriato per te, ma potresti avere per ripresentarla o nasconderla del tutto in alcuni casi.Per esempio quando viene visualizzato da un elemento del pulsante della barra, il controller popover automaticamente regola la posizione (e potenzialmente la dimensione) del popover per tenere conto per modificare la posizione della barra elemento pulsante.Tuttavia, se si rimuove l'elemento del pulsante della barra durante il rotazione, oppure Se hai presentato il da un rettangolo di destinazione in un vista, il controller popover non lo fa Tenta di riposizionare il riquadro di inserimento.In in questi casi, è necessario nascondere manualmente il popover o presentarlo di nuovo da una nuova posizione adeguata.Si può Eseguire questa operazione nel file didRotateFromInterfaceOrientation: del controller di visualizzazione che si utilizzato per presentare il popover.

Questa è una vecchia questione, ma vedo che non era chiaro a OP quello che deve fare con il suggerimento di Kris Markel. Questo è documentato in tecnici Q & A QA1694 . Basta presentare nuovamente la popover.

Diciamo che hai messo il tuo codice popover sopra in un metodo chiamato showPopover. Basta chiamare quel metodo a rotazione, prima facendo in modo che sia visibile:

-(void)showPopover {
    aRect = self.myElement.frame;
    aRect.origin.x += aRect.size.width;

    [self.aPopOver presentPopoverFromRect:aRect inView:self.myElement.superview permittedArrowDirections:UIPopoverArrowDirectionRight animated:YES];
}

-(void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)oldOrientation
{
    if ([self.aPopover isPopoverVisible]) {
        [self showPopover];
    }
}

Utilizzare il metodo UIPopoverPresentationControllerDelegate seguito menzionato nel viewcontroller.

func popoverPresentationController(_ popoverPresentationController: UIPopoverPresentationController,
                                   willRepositionPopoverTo rect: UnsafeMutablePointer<CGRect>,
                                   in view: AutoreleasingUnsafeMutablePointer<UIView>) {
    rect.pointee = self.view.bounds
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top