2012-07-05 1 views
18

Il mio obiettivo è quello di mantenere le stesse coordinate per un UIPopoverController semplicemente cambiando l'offset della freccia. Quindi in pratica ho tre pulsanti che toccano ognuno di loro mostra un popover. Quando presenta questo popover cambia posizione sullo schermo, ma non lo voglio. Per essere sguardo più chiaro screenoshots:Presente UIPopoverController nella stessa posizione con modifica solo offset della freccia

enter image description here

enter image description here

enter image description here

+1

+1, questa è una domanda interessante. –

risposta

15

Per il mio popover ho voluto la freccia di essere in alto a sinistra invece che in alto al centro (che è di default).

Sono riuscito a ottenere il risultato di seguito (schermata) impostando la proprietà popoverLayoutMargins di UIPopoverController. È possibile utilizzarlo per ridurre l'area dello schermo utilizzata nei calcoli interni di UIPopoverController per determinare dove mostrare il popover.

UIPopovercontroller arrow on the left

Il codice:

// Get the location and size of the control (button that says "Drinks") 
CGRect rect = control.frame; 

// Set the width to 1, this will put the anchorpoint on the left side 
// of the control 
rect.size.width = 1; 

// Reduce the available screen for the popover by creating a left margin 
// The popover controller will assume that left side of the screen starts 
// at rect.origin.x 
popoverC.popoverLayoutMargins = UIEdgeInsetsMake(0, rect.origin.x, 0, 0); 

// Simply present the popover (force arrow direction up) 
[popoverC presentPopoverFromRect:rect inView:self.view permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES]; 

penso che sarete in grado di ottenere il risultato desiderato modificando quanto sopra.

+0

impostazione popoverLayoutMargins prima di visualizzare funziona alla grande. grazie. – Bastek

+0

Funziona a meraviglia, grazie. – rosshump

+0

C'è un modo per posizionare la punta della freccia esattamente in un punto all'interno della vista sorgente. Sto usando l'intero schermo come vista sorgente, in modo tale che quando ci sono cambiamenti nell'orientamento del dispositivo, cambio solo il sorgente rect, che è di dimensioni 1x1 unità. Il problema è che la freccia è lieve a destra di dove dovrebbe essere. – rraallvv

1

Non si può fare così com'è con classe UIPopoverViewController built-in di Apple. Ma dovrebbe essere abbastanza semplice e logico implementare il proprio controller di visualizzazione popover (solo una geometria 2D molto semplice e un po 'di scavo nei documenti di UIView).

+1

può essere fatto con i popover di Apple. Se guardi i popover dalle righe di visualizzazione tabella, la freccia può seguire la riga mentre scorre la tabella. Quindi, se la freccia è collegata a un rettangolo in una vista, puoi spostare quella vista e la freccia seguirà. – Gabriel

+0

Ma il contenuto rect rimarrà nella sua posizione originale? Non seguirà la freccia per essere centrata? –

+0

No. Il popover nella mia app è grande, tutto lo spazio disponibile fino in fondo. La freccia punta a una riga della vista tabella nella vista principale di una vista divisa. Quando alla fine appare una nuova riga e scorre la vista tabella, il salice segue la riga. – Gabriel

1

Sì, puoi farlo. Devi creare una vista aux, con alpha = 0.0f, e usarla per guidare la freccia.

Ad esempio:

auxView = [[UIView alloc] initWithFrame:firstButton.frame]; 
auxView.alpha = 0.0 ; 
auxView.userInteractionEnabled = NO; 
[firstButton.superView addSubview:auxView]; 
[auxView release]; 

Ok, ora si popover aperta utilizzando questo punto di vista, come guida di freccia.

[thePopoverController presentPopoverFromRect:auxView.bounds inView:auxView 
      permitedArrowDirections:UIPopoverArrowDirectionLeft animated:YES]; 

E ora si hanno solo per spostare la visualizzazione:

auxView.frame = secondButton.frame; 

Utilizzare animazioni per quella mossa, se si desidera.

Un'altra cosa, per questo tipo di freccia a pulsante, preferisco che la freccia tocchi il pulsante. È possibile utilizzare:

presentPopoverFromRect:CGRectInset(auxView.bounds, 4.0, 4.0) 
+0

Esegui su iOS 6.0 sim, non funziona. – CodaFi

+0

@CodaFi cosa non funziona esattamente? La freccia non segue la vista in movimento? – Gabriel

+0

Sì, ma il popover si muove con esso! – CodaFi