objective-c ios ios5 uipopovercontroller

objective c - Presente UIPopoverController en la misma posición con solo cambiar la flecha desplazada



objective-c ios (3)

No puede hacerlo como está con la clase UIPopoverViewController incorporada de Apple. Pero debería ser bastante simple y lógico implementar su propio controlador de vista emergente (solo una geometría 2D muy básica y un poco de excavación en los documentos de UIView).

Mi objetivo es mantener las mismas coordenadas para un UIPopoverController con solo cambiar la flecha desplazada. Así que básicamente tengo tres botones tocando cada uno de ellos aparece una ventana emergente. Al presentar esta ventana emergente, cambia la posición en la pantalla, pero no quiero eso. Para ser más claros, mira los screensoshots:


Para mi ventana emergente, quería que la flecha estuviera en la parte superior izquierda en lugar de en la parte superior central (que es la opción predeterminada).

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

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 podrás obtener el resultado deseado al modificar lo anterior.


Si tu puedes hacerlo. 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 abres la ventana emergente usando esa vista como guía de flecha.

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

Y ahora solo tienes que mover la vista:

auxView.frame = secondButton.frame;

Usa animaciones para ese movimiento si quieres.

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

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