Pregunta

Cuando estoy cambiando entre vertical a horizontal (y viceversa) en el iPad, la posición de mi vista popover se ilegible. Así es como estoy marco de mi vista popover calculando:

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

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

Por favor, dime cuál es incorrecto aquí?

¿Fue útil?

Solución

bien, noto algo extraño en su código.

cualquier razón está agregando el tamaño del ancho para el origen de la posición x del aRect? aRect.origin.x + = aRect.size.width;

im suponiendo que desea que esta sea la esquina superior derecha ....

Se puede eliminar el comentario el código en el archivo .m y hacerlo de esta manera:

// 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 lo que yo haría en su situación si quieres la disposición de su subvistas es utilizar el didRotateFromIntferfaceOrientation: de este modo:

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

y también layoutSubviews

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

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

Funciona de la siguiente manera.

PK

Otros consejos

A partir de la documentación UIPopoverController : (énfasis mío)

  

Si gira el usuario del dispositivo, mientras que una   popover es visible, el popover   controlador oculta la popover y luego   muestra de nuevo al final de la   rotación. El controlador popover   intentos de posicionar el popover   adecuada para usted, pero es posible que tenga   para presentar de nuevo o ocultarlo   por completo en algunos casos. Por ejemplo,   cuando se visualiza desde un elemento de botón de la barra,   el controlador popover automáticamente   ajusta la posición (y potencialmente   el tamaño) de la popover a la cuenta   para cambios a la posición de la barra   elemento de botón. Sin embargo, si se quita   el elemento de botón de la barra durante el   rotación, o si se presentó el   Popover de un rectángulo de destino en una   Ver , el controlador popover no lo hace   intentar cambiar la posición del popover. En   esos casos, debe ocultar manualmente   la popover o presente de nuevo desde   una apropiarse nueva posición. Usted puede   hacer esto en el    didRotateFromInterfaceOrientation:   método del controlador de vista que se   utilizado para presentar la popover.

Esta es una vieja pregunta, pero veo que no estaba claro a OP lo que debía hacer con la sugerencia de Kris Markel. Esto está documentado en Técnica Q y A QA1694 . Sólo tiene que presentar el popover nuevo.

Digamos que usted ha puesto su código popover anteriormente en un método llamado showPopover. Sólo tiene que llamar ese método en la rotación, asegurándose primero de que es visible:

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

Usar el método UIPopoverPresentationControllerDelegate mencionado a continuación en el ViewController.

func popoverPresentationController(_ popoverPresentationController: UIPopoverPresentationController,
                                   willRepositionPopoverTo rect: UnsafeMutablePointer<CGRect>,
                                   in view: AutoreleasingUnsafeMutablePointer<UIView>) {
    rect.pointee = self.view.bounds
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top