2012-07-05 14 views
18

Mi objetivo es mantener las mismas coordenadas para un UIPopoverController con solo cambiar el desplazamiento de la flecha. Así que, básicamente, tengo tres botones tocando cada uno de ellos muestra un popover. Al presentar este popover, cambia de posición en la pantalla, pero no quiero eso. Ser aspecto más claro en screenoshots:Presente UIPopoverController en la misma posición con el cambio de desplazamiento de flecha simple

enter image description here

enter image description here

enter image description here

+1

+1, esta es una pregunta interesante. –

Respuesta

15

Por mi popover que querían la flecha para ser parte superior izquierda en lugar de la parte superior del centro (que es por defecto).

He logrado obtener el resultado a continuación (captura de pantalla) configurando la propiedad popoverLayoutMargins del UIPopoverController. Puede usarlo para reducir el área de pantalla utilizada en los cálculos internos del UIPopoverController para determinar dónde mostrar el popover.

UIPopovercontroller arrow on the left

El código:

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

creo que usted será capaz de obtener el resultado deseado mediante la deformación de los anteriores.

+0

configuración popoverLayoutMargins antes de mostrar funciona muy bien. Gracias. – Bastek

+0

Funciona como un regalo, gracias. – rosshump

+0

¿Hay alguna manera de colocar la punta de la flecha exactamente en un punto dentro de la vista de origen? Estoy usando toda la pantalla como vista de origen, de modo que cuando hay cambios en la orientación del dispositivo, simplemente cambio el rect de origen, que tiene un tamaño de 1x1 unidades. El problema es que la flecha está ligeramente a la derecha de donde se supone que debe estar. – rraallvv

1

No se puede hacer como se encuentra, clase UIPopoverViewController incorporada de Apple. Pero debería ser bastante simple y lógico implementar tu propio controlador de vistas popover (solo una geometría 2D muy básica y un poco de excavación en los documentos de UIView).

+1

se puede hacer con los popovers de Apple. Si observa los popovers desde las filas de la vista de tabla, la flecha puede seguir la fila a medida que se desplaza la tabla. Entonces, si la flecha está vinculada a un rect en una vista, puedes mover esa vista y la flecha seguirá. – Gabriel

+0

¿Pero se mantendrá el contenido en su posición original? ¿No seguirá la flecha para estar centrado? –

+0

No. El popover en mi aplicación es grande, todo el espacio disponible hasta la parte inferior. La flecha apunta a una fila de la vista de tabla en la vista maestra de una vista dividida. Cuando finalmente aparece una nueva fila y la vista de tabla se desplaza, el areow sigue la fila. – Gabriel

1

Sí, puedes hacer eso. Tienes que crear una vista auxiliar, con alfa = 0.0f, y usarla para guiar la flecha.

Por ejemplo:

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

Ok, ahora popover abierta usando este punto de vista como guía de flecha.

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

Y ahora es suficiente con mover la vista:

auxView.frame = secondButton.frame; 

Use animaciones para los que se mueven, si quieres.

Una cosa más, para este tipo de flecha a botón, prefiero que la flecha toque el botón. Se puede utilizar:

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

Ejecutar en iOS 6.0 sim, no funciona. – CodaFi

+0

@CodaFi ¿qué es exactamente lo que no funciona? ¿La flecha no sigue la vista en movimiento? – Gabriel

+0

Sí, ¡pero el popover se mueve con él! – CodaFi

Cuestiones relacionadas