2010-07-21 22 views
54

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 ControladoresTamaño personalizado del iPad del controlador de vista modal

Ahora estoy usando UIModalPresentationPageSheet pero mi opinión es de menor altura y tengo un espacio en blanco fea

presentación deseada

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

presentación real

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

Si uso UIModalPresentationFormSheet, la información r es más pequeño en ancho.

Estoy tratando de encontrar la manera de 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"? Panecillos no se ajusta a mis necesidades de diseño :(

+1

que sería bueno de que acepte una respuesta correcta a su pregunta haciendo clic en la marca de verificación de color gris junto a él. – Rajesh

Respuesta

34

que obtuvo el siguiente resultado (link text) mediante el uso de:.

self.modalPresentationStyle = UIModalPresentationFormSheet; 

y presentándolo como un controlador de vista modal Quiero saber si necesita más ayuda .

+4

Gracias por la respuesta, pero FormSheet no se ajusta a mi tamaño (dije en la pregunta). – emenegro

+0

puede ajustar el marco en viewDidAppear – marcio

+1

Funciona, pero la sombra es igual al marco original de la hoja de formulario. Pero ... es un buen enfoque. Gracias, si nadie responde, la recompensa es suya;) – emenegro

3

una solución es utilizar UIModalPresentationPageSheet presentar una hoja a continuación, cambiar el tamaño de página y de inmediato la vista modal. esto se explica completamente en this answer to another question.

18

la mejor manera de hacer esto es cambiar la bo la propiedad de unds 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 se debe agregar una Ivar privado en su clase:

@implementation MySpecialFormsheet { 
    CGRect _realBounds; 
} 

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

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

Es necesario para almacenar en caché _realBounds en su viewDidLoad método:

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

Hola en mi aplicación utilicé aparecer nueva Vista en el lado izquierdo no en el centro. ¿Cómo puedo hacer? –

+0

¡jajaja! ¡Esto funciona genial! – pnizzle

+0

Genial, esto es lo que necesitaba exactamente. Muchas gracias. –

6

incluso para reducir la altura de la hoja-forma y el ancho se puede utilizar

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

Funciona perfectamente para mí. – frax

+0

¡Hombre, todavía no puedo creer lo fácil que es! Estaba planeando crear mi propia Vista para simular el efecto UIModalViewController. Gracias! – DZenBot

19

tuve un problema para conseguir el tamaño personalizado modal hacia el centro hasta que me di cuenta lo que se estableció en ViewController.view.superview.frame inicialmente. Se determina según el tipo UIModalPresentation. superview.center ni siquiera es necesario (en lo que respecta a mis pruebas).

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

Aquí fue 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 entonces miré a la respuesta anterior y se enfrentan a Palmed. Acorta mi solución un poco mediante la sustitución de la última línea con:

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

EDITAR de solución final y los comentarios.

+0

Normalmente uso la misma solución para cambiar el tamaño de una vista modal. Pero me doy cuenta de que no funciona para iOS 6. La vista siempre se atasca en la parte superior de la vista principal. ¿¿Alguna solución?? gracias – Frade

+0

Pruebo en un ipad con ios 6 y no he visto esto suceder. ¿Qué estás probando? ¿Funciona esta solución si la pruebas? – Brenden

+0

mi problema es que no puedo cambiar el origen del marco de la supervista. cambia el tamaño pero no el centro. solo si lo hago en el bloque de finalización ... – Frade

84

Como 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, he encontrado una solución que funcionó para mí:

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

Esto funciona para mí. Centra correctamente una hoja de formulario redimensionada en iOS 6. –

+2

Funciona también para iOS 7 – Renexandro

+0

Esto funciona para mí – Prasad

1

cambiar el tamaño del punto de vista modal "después" que se presenta utilizando presentModalViewController method.See este enlace para cambiar el tamaño modal Ver https://coderwall.com/p/vebqaq

+1

Publique una respuesta, no un enlace. –

+0

Básicamente, la publicación en el enlace anterior sugiere Cambiar el tamaño de la vista modal "después" que se presenta utilizando el método presentModalViewController. – iosDeveloper

5

Los enfoques descritos anteriormente deban ser modificados 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 iOS 6.)

4

Incluso he tenido problemas 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á utilizando uno) en la sección "simulado Metrics seleccione el tamaño de 'forma libre'.

Aparte de esto tiene que escribir el código de abajo en su controlador de vista presentados (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, así

+1

Ojalá pudiera votar esto dos veces. Intenté TODO (aproximadamente 3 horas de mi vida dedicadas exclusivamente a esto) hasta que esto finalmente funcionó. Gracias. – LMVogel

24

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 se puede utilizar UIPresentationController que le da más opciones de personalización.

+0

Gracias por compartir la manera fácil en iOS 8, acabo de pasar 2 horas tratando de averiguar cómo hacerlo y no hay nada en el documento oficial (ahora) sobre esto. – bontoJR

+0

¡Genial! Recuerde que también puede definir el tamaño de contenido preferido Interface Builder. – MrAlek

+0

preferredContentSize funciona bien para mí. Pero necesito cambiar mi posición en iOS 8. ¿Qué propiedad debo usar? –

7

Esta es mi solución para una vista NO de autodiseño (nunca lo intenté con el autolayout) y cumple 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 la preferredContentSize 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 para mostrar el teclado en el iPad.

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

[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 
+0

Gracias , esto funciona bien! –

+0

preferredContentSize funciona bien para mí. Pero necesito cambiar mi posición en iOS 8. ¿Qué propiedad debo usar? –

+0

@VipinVijay: ¿Has descubierto cómo cambiar de posición en iOS 8 y superior? – UditS

0

Esta solución trabajado para mí, ya que tenía el mismo problema.

Mi estructura vista modal es la siguiente (utilizo UIModalPresentationCurrentContext en ambos controladores de presentación y presentados para lograr la 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 I sobrescribió 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.

1

Puede utilizar MZFormSheetController así:

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