Modal view controller size con master-detail controller

Mi aplicación tiene una interfaz de detalle maestro dividida: cuando el usuario golpea un button particular en el lado de detalle de la pantalla, uso un UIModalTransitionStyleFlipHorizontal modalTransitionStyle para que pueda presentar un nuevo controller de manera modal y hacer que aparezca como si el panel de detalles tuviera "volteado" a la nueva interfaz.

Si bien esto funciona bien en el iPhone, cuando lo pruebo en el iPad, el nuevo controller modal gira desde el lado de los detalles de la pantalla, pero al final de la animation, cubre toda la pantalla.

¿Cómo puedo hacer que el controller solo se active en el lado de los detalles de la pantalla?

Si aún no lo has descubierto, estás en la mayor parte del path. Debe definir el context de presentación de la vista modal para "context actual" para que solo funcione en la vista de detalles y no en toda la vista de supervisión.

la forma más sencilla de hacerlo es configurar la vista en el guión gráfico con un segue. En IB, cree el nuevo controller de vista, agregue un segue y edite la línea segue dándole un nombre "flipper", configúrelo en modal, configúrelo para voltearlo y configúrelo en "context actual".

Una vez que se han establecido esas properties, puede simplemente ajustarse al controller de vista, pero inicielo desde el controller de vista de detalle como este:

 [self performSegueWithIdentifier:@"flipper" sender:self]; 

Si necesita hacer la transición en el código, se vería así:

 UIViewController *abc = [self.storyboard instantiateViewControllerWithIdentifier:@"flipper"]; [abc setModalPresentationStyle:UIModalPresentationCurrentContext]; [abc setModalTransitionStyle:UIModalTransitionStyleFlipHorizontal]; [self presentViewController:abc animated:YES completion:nil]; 

cuidate.

Mi problema era que presentaba el controller desde un UIViewController normal, pero debería haberlo presentado desde el controller de vista dividida.

Para mí hay 2 opciones, una forma correcta (ver transiciones de animation) y una forma hacky (ensuciarse con la presentación de un controller).

En primer lugar, de forma hack, puede presentar su controller de vista modal, como usted sabe, un controller de vista modal asume la pantalla y es el único controller accesible mientras se presenta, pero puede cambiar el tamaño para que termine hasta presentarse sobre la sección de detalles de solo la pantalla, el problema aquí es que no está pensado para cambiar el tamaño y los errores, y también es muy fácil tener problemas cuando ocurren rotaciones. Además, no podrá interactuar con la parte maestra de UISplitViewController mientras este controller esté presente.

Esto podría hacerse así por ejemplo:

 UIViewController *detail = [[UIViewController alloc] init]; detail.modalPresentationStyle = UIModalPresentationFormSheet; detail.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal; if([self respondsToSelector:@selector(presentViewController:animated:completion:)]){ [self presentViewController:detail animated:YES completion:nil]; }else{ [self presentModalViewController:detail animated:YES]; } detail.view.superview.frame = CGRectMake(320.0, 0.0, self.view.frame.size.width - 320.0, self.view.frame.size.height); [detail release]; 

Es posible que deba ajustar la vista de supervisión del centro de detalles de la vista de los controlleres … Esto no lo recomiendo.

Su otra solución es usar animaciones UIView dentro de su controller de vista de detalles para cambiar su vista y animar para girar.

Para ver cómo se vería, echa un vistazo a la aplicación de Facebook para iOS; en el chat, cuando estás en una conversación, puedes tocar el button […] en la esquina superior derecha y los contenidos de la vista se voltean y puedes ajustar la notificación configuraciones para esa persona / chat.

Por ejemplo, puede hacer lo siguiente cuando toca un button en el controller de vista de detalle:

 UIViewController *someOtherController = [...]; [UIView beginAnimations:nil context:NULL]; [UIView setAnimationDuration:0.8]; [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:self.view cache:YES]; [self.view addSubview:someOtherController.view]; [UIView commitAnimations]; 

Haría lo contrario para eliminarlo.