ipad uiviewcontroller modalviewcontroller

ipad - presentviewcontroller swift 4



TamaƱo personalizado iPad del controlador de vista modal (13)

Tengo un par de controladores de vista modal de cierto tamaño. Intento evitar el uso de vistas personalizadas (creación de superposición traslúcida negra a pantalla completa sobre la vista actual, agregar la vista modal sobre esa vista, hacer las animaciones, etc.) para presentarla porque no hay modalPresentationStyle que se ajuste al tamaño de mi Controladores

Ahora estoy usando UIModalPresentationPageSheet pero mi vista es más pequeña en altura y tengo un espacio en blanco feo

Presentación deseada

_______________ | _______ | | | | | | | MyVC | | | | | | | ------- | ---------------

Presentación real

_______________ | | | | | | MyVC | | | | | | | |-------| | | | blank | | ---------------

Si utilizo UIModalPresentationFormSheet, el contenedor tiene un ancho menor.

Estoy intentando descubrir cómo hacerlo, pero no sé si es posible. ¿Cuál es la solución al problema de presentar un VC modal más pequeño que cualquiera de los estilos de presentación? ¿La única solución es organizar un "motor de control de vista modal personalizado"? Popovers no se ajusta a mis requisitos de diseño :(


Cambiar el tamaño de la vista modal "después" se presenta utilizando el método presentModalViewController. Consulte este enlace para cambiar el tamaño de la vista modal https://coderwall.com/p/vebqaq


Como algunos otros usuarios aquí, también tuve el problema de que el origen del controlador de vista modal no era correcto. Después de algunos experimentos, encontré una solución que funcionó para mí:

- (void)viewWillLayoutSubviews{ [super viewWillLayoutSubviews]; self.view.superview.bounds = CGRectMake(0, 0, <width>, <height>); }


Esta es mi solución para una vista NO de autodiseño (nunca lo intenté con el autolayout) y cumplí con iOS 7 e iOS 8.

Al principio, asegúrese de llamar a la vista modal de esta manera:

CloudSettingsViewController *cloudController = [[CloudSettingsViewController alloc] initWithNibName:@"CloudSettingsView" bundle:nil]; CGRect originalBounds = cloudController.view.bounds; cloudController.modalTransitionStyle = UIModalTransitionStyleCrossDissolve; cloudController.modalPresentationStyle = UIModalPresentationFormSheet; [self presentViewController:cloudController animated:YES completion:nil];

Con iOS 8, establezca el ContextoPreferido preferido en el método viewDidLoad de la vista modal.

- (void)viewDidLoad { [super viewDidLoad]; // backup of the original size (selected in interface builder) height = self.view.frame.size.height; width = self.view.frame.size.width; if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8) // versioni successive ios 8 self.preferredContentSize = CGSizeMake(width, height); // this is necessary to get the correct size of the modal view }

Esto también funciona cuando la vista modal necesita mostrar el teclado en el iPad .

Con versiones anteriores de iOS 8, debe establecer los límites después de la llamada presente ViewController:

[currentController presentViewController:controlPanelController animated:YES completion:nil]; if ([[[UIDevice currentDevice] systemVersion] floatValue] < 8) cloudController.view.superview.bounds = originalBounds;//it''s important to do this after


Esta solución funcionó para mí ya que tuve el mismo problema.

Mi estructura de vista modal es la siguiente (uso UIModalPresentationCurrentContext tanto en los controladores presentados como en los presentados para lograr transparencia en el VC presentado)

ModalViewController > UIView (view) - resized to the same size as the presenting controller but has semi-translucent background - done automatically >> UIView (contentView) - the true view with the content of the popup - this is the one that got consistently placed at the top of the screen all the time

En ModalViewController sobreescribí el siguiente método para solucionar el problema de posicionamiento:

- (void) viewWillLayoutSubviews(){ [super viewWillLayoutSubviews]; CGRect r = self.view.bounds(); self.contentView.center = CGPointMake(r.size.width/2,r.size.height/2); }

De hecho, creo y dimensiono la vista de contenido primero pero en un método diferente.

Espero que esto ayude a alguien.


Incluso yo estaba luchando con el mismo problema durante bastante tiempo. Después de dar algunos intentos de muchas de las respuestas dadas aquí, se me ocurrió una solución que me funcionó bastante bien.

Aquí está el código al presentar el controlador de vista.

SomeViewController *sovcObj = [[SomeViewController alloc] initWithNibName:@"SyncOptionsViewController" bundle:nil]; someObj.modalPresentationStyle = UIModalPresentationFormSheet; someObj.modalTransitionStyle = UIModalTransitionStyleCrossDissolve; [self presentViewController:someObj animated:YES completion:nil]; someObj.view.superview.bounds = CGRectMake(0, 0, 400, 400); // whatever width and height you want

En el xib (si está usando uno) en la sección "Métricas simuladas", seleccione el tamaño de "Forma libre".

Aparte de esto, debe escribir el código siguiente en su controlador de vista presentado (es decir, SomeViewController en este ejemplo)

- (void)viewWillLayoutSubviews{ [super viewWillLayoutSubviews]; self.view.superview.bounds = CGRectMake(0, 0, 400, 400); // whatever width and height you want

}

Este código también funciona para iOS 7


La mejor manera de hacerlo es cambiar la propiedad de límites en la supervista de la vista que se presenta dentro de la hoja de formularios. Cuando presenta una vista modalmente, la vista presentada se integra dentro de otra vista.

Debe establecer la propiedad de límites de la supervista en el mismo rect que los límites de la vista. Primero agrega un ivar privado en tu clase:

@implementation MySpecialFormsheet { CGRect _realBounds; }

Lo mejor es hacer esto en viewWillAppear: de que viewWillAppear: Agregue el siguiente código al controlador de vista que se presenta de forma modal:

- (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; self.view.superview.bounds = _realBounds; }

Necesita almacenar en caché _realBounds en su método viewDidLoad :

- (void)viewDidLoad { _realBounds = self.view.bounds; [super viewDidLoad]; }


Los enfoques descritos anteriormente deben modificarse para iOS7:

// set desired bounds, then call -presentFromViewController: @implementation PresentedViewController { CGRect _presentationBounds; } - (void)presentFromViewController:(UIViewController *)viewController { self.modalTransitionStyle = UIModalTransitionStyleCoverVertical; self.modalPresentationStyle = UIModalPresentationFormSheet; _presentationBounds = self.view.bounds; [viewController presentViewController:self animated:YES completion:nil]; } - (void)viewWillLayoutSubviews { [super viewWillLayoutSubviews]; if (!CGRectIsEmpty(_presentationBounds)) { self.view.superview.bounds = _presentationBounds; _presentationBounds = CGRectZero; } }

(Este código también funciona en iOS6).


Obtuve el siguiente resultado ( texto del enlace ) al usar:

self.modalPresentationStyle = UIModalPresentationFormSheet;

y presentándolo como un controlador de vista modal. Avíseme si necesita ayuda adicional.


Puedes usar MZFormSheetController así:

MZFormSheetController *formSheet = [[MZFormSheetController alloc] initWithSize:customSize viewController:presentedViewController]; [presentingViewController mz_presentFormSheetController:formSheet animated:YES completionHandler:nil];


Todas estas respuestas no funcionarán en ios8 SDK.

Esto funcionará:

AboutViewController * _aboutViewController = [[AboutViewController alloc] init]; _aboutViewController.modalPresentationStyle = UIModalPresentationFormSheet; if(IS_IOS8) { _aboutViewController.preferredContentSize = CGSizeMake(300, 300); } [self presentViewController:_aboutViewController animated:YES completion:nil];

En AboutViewController.m

- (void)viewWillLayoutSubviews{ [super viewWillLayoutSubviews]; if(!IS_IOS8) { self.view.superview.bounds = CGRectMake(0, 0, 300, 300); } }

IS_IOS8

#define IS_IOS8 ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8)

En iOS 8 también puedes usar UIPresentationController, que te brinda más opciones de personalización.


Tuve un problema al centrar el modal de tamaño personalizado hasta que descubrí lo que ViewController.view.superview.frame estaba configurado inicialmente. Se determina según el tipo UIModalPresentation. superview.center ni siquiera es necesario (en lo que se refiere a mis pruebas).

Además, establezco las coordenadas dinámicamente usando [UIScreen mainScreen].applicationFrame , solo [UIScreen mainScreen].applicationFrame orientación horizontal por ahora. Debe hacer una comprobación condicional para admitir tanto el retrato como el paisaje volteando los valores X / Y y Alto / Ancho.

Aquí estaba mi primera solución de trabajo para iOS 6.0:

ViewController.modalPresentationStyle = UIModalPresentationFormSheet; ViewController.modalTransitionStyle = UIModalTransitionStyleCrossDissolve; [self presentViewController:ViewController animated:YES completion:nil]; ViewController.view.superview.autoresizingMask = UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin; ViewController.view.superview.frame = CGRectMake( // Calcuation based on landscape orientation (width=height) ([UIScreen mainScreen].applicationFrame.size.height/2)-(320/2),// X ([UIScreen mainScreen].applicationFrame.size.width/2)-(320/2),// Y 320,// Width 320// Height );

Y luego miré la respuesta anterior y la miraba a la cara. Acorta un poco mi solución al reemplazar la última línea con:

ViewController.view.superview.bounds = CGRectMake(0, 0, 320, 320);

EDIT para la solución final y comentarios.


Una solución es usar UIModalPresentationPageSheet para presentar una hoja de página y luego cambiar el tamaño inmediatamente de la vista modal. Esto se explica completamente en esta respuesta a otra pregunta .


incluso para reducir la altura y el ancho de la hoja forma, puede usar

[self.view.superview setBounds:CGRectMake(0, 0, 450, 480)];