cuestión con la posición de vista popover
-
27-09-2019 - |
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í?
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
}