Tengo un problema con iOS 7 que parece ser un error o simplemente no hacer algo. He modalViewController que aparece como una ventana emergente en el iPad, con ModalPresentationStyle. Y no es de tamaño estándar, de tamaño personalizado.
Aquí está el código:

myViewController *myVC = [[myViewController alloc] init];
UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:myVC];
[nav setModalPresentationStyle:UIModalPresentationFormSheet];
[nav setModalTransitionStyle: UIModalTransitionStyleFlipHorizontal];
[self presentViewController:nav animated:YES completion:nil];
nav.view.superview.bounds = CGRectMake(0, 0, 320, 465);

Todo está funcionando bien en iOS 6, pero en iOS 7 no está centrado.
Pero si me puse ModalTransitionStyle a UIModalTransitionStyleCrossDissolve funciona bien. Pero sólo en este modo.
Tal vez alguien tropezó en esta también y sabes cómo solucionarlo? Yo no soy un gran fan de disolver efecto.
Gracias.

InformationsquelleAutor titicaca | 2013-09-22

6 Comentarios

  1. 2

    Tengo un método en el que la vieja costumbre modal estilo de presentación fromsheet trabaja con iOS <=7 aunque se podría establecer custom height and width.

    Tenga en cuenta que este método puede no funcionar en cualquier versión más reciente en el futuro

    - (void) hackModalSheetSize:(CGSize) aSize ofVC:(UIViewController *) aController;
    {
    
        void (^formSheetBlock) (void) = ^{
            int preferredWidth = aSize.width;
            int preferredHeight = aSize.height;
    
            CGRect frame = CGRectMake((int) 1024/2 - preferredWidth/2,
                                      (int) 768/2 - preferredHeight/2,
                                      preferredWidth, preferredHeight);
            aController.view.superview.frame = frame;
            if([aController respondsToSelector:@selector(edgesForExtendedLayout)]) { //ios7
                aController.view.superview.backgroundColor = [UIColor clearColor];
            } else { //< ios7
                UIImageView *backgroundView = [aController.view.superview.subviews objectAtIndex:0];
                [backgroundView removeFromSuperview];
            }
        };
    
        //on ios < 7 the animation would be not as smooth as on the older versions so do it immediately
        if(![self respondsToSelector:@selector(edgesForExtendedLayout)]) {
            formSheetBlock();
            return;
        }
    
        double delayInSeconds = .05;
        dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
    
        dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
            formSheetBlock();
        });
    }
    • Voy a aceptar esta respuesta ya que esto es trabajo para mí, al menos por ahora. A pesar de que terminé usando MZFormSheetController – es realmente un gran estilo de ios 7 solución, a mi me funciona en ambas versiones de ios. Aunque realmente me gustaría averiguar en un futuro cómo manejar esto con los nativos de ios kit, parece un error por ahora.
    • hey no es sólo mostrar pop-up y de nuevo vamos a plena vista en forma de hoja. ninguna idea sobre esto stackoverflow.com/questions/30615075/…
  2. 39

    Yo tenía el mismo problema. Yo lo he solucionado esto mediante el uso de otro método, se encontró aquí.

    Lo que esta solución propone es utilizar el método de (void)viewWillLayoutSubviews

    Por lo que en caso de @Manuel M. dentro de la GeneralSettingsViewController agregue el código siguiente:

    //GeneralSettingsViewController
    - (void)viewWillLayoutSubviews{
        [super viewWillLayoutSubviews];
        self.view.superview.bounds = CGRectMake(0, 0, 497, 375);
    }

    Y usted no necesitará este código ya:

    self.generalSettingsVC.view.superview.frame = CGRectMake(0, 0, 497, 375);
    self.generalSettingsVC.view.superview.center = self.view.center;

    Para @titicaca, está utilizando un UINavigationController no he de prueba con este Controlador, pero usted podría tratar de la misma solución que he mencionado, la ampliación de la UINavigationController y sobrescribir el viewWillLayoutSubviews método.

    [EDITAR]

    Para @titicaca he probado en un nuevo proyecto y a mí me ha funcionado. Yo lo que hice fue tener una navegación personalizada controlador de vista de CustomNavigationController primordial de la viewWillLayoutSubviewscomo este:

    - (void)viewWillLayoutSubviews{
        [super viewWillLayoutSubviews];
        self.view.superview.bounds = CGRectMake(0, 0, 330, 284);
    }

    A continuación, el controlador de vista que presenta el CustomNavigationController debe ejecutar un código similar a este:

    UIViewController *myVC = [[UIViewController alloc] init];
    [myVC.view setBackgroundColor:[UIColor redColor]];
    
    CustomNavigationController *nav = [[CustomNavigationController alloc] initWithRootViewController:myVC];
    [nav setModalPresentationStyle:UIModalPresentationFormSheet];
    [nav setModalTransitionStyle: UIModalTransitionStyleFlipHorizontal];
    
    [self presentViewController:nav animated:YES completion:nil];

    Usted necesita para asegurarse de que las dimensiones de la self.view.superview.bounds = CGRectMake(0, 0, 330, 284); son los números de lo contrario, el texto en el interior se pone borroso, si hay alguna

    • Me preguntaba si alguien podría explicar por qué a) la view.superview.bounds propiedad tiene para recibir llamadas con el fin de solucionar este problema, y b) cómo pasar en (0,0) para el rect del origen de las causas que centro?
    • He encontrado viewWillAppear: es un lugar aún mejor para poner self.view.superview.bounds=xxx puesto que se llama antes de viewWillLayoutSubviews
  3. 5

    Para mí el problema estaba llamando becomeFirstResponder en un campo de texto en el viewDidAppear de que el controlador de vista. Parece ser un error con eso ahora. La solución fue envolviendo en un simple dispatch_async:

    - (void)viewDidAppear:(BOOL)animated
    {
        [super viewDidAppear:animated];
        dispatch_async(dispatch_get_main_queue(), ^{
            [self.userNameTextField becomeFirstResponder];
        });
    }
  4. 4

    Es lo mismo para mí… aún no sé cómo resolverlo. Actualmente estoy trabajando en ese tema, así que nada puedo obtener la compartiré!

    Este es mi código.

    -(IBAction)showGeneralSettings:(id)sender{
    
    self.generalSettingsVC = [[GeneralSettingsViewController alloc] initWithNibName:@"GeneralSettingsView" bundle:nil];
    
    //Present the view controller as a modal with a custom size (important to do after presenting it)
    self.generalSettingsVC.modalPresentationStyle = UIModalPresentationFormSheet;
    
    [self presentViewController:self.generalSettingsVC animated:YES completion:nil];
    
    self.generalSettingsVC.view.superview.frame = CGRectMake(0, 0, 497, 375);
    self.generalSettingsVC.view.superview.center = self.view.center;

    }

    • Hola Manuel, encontraste alguna solución?
    • Hey! la solución de @Tamara Bernad funciona realmente bien. Intente. No puedo votar, ya que bueno, porque yo no tengo reputación aún 🙁
    • Por desgracia, no funcionó para mí que bien. Coloca la ventana emergente en el centro, pero no es de mi talla, es sólo de tamaño estándar de la ventana emergente de la ventana con mis cosas centrada en su interior, así..
  5. 3

    La solución anterior no funciona para mí. He utilizado el siguiente:

          UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:theViewController];
          navigationController.modalPresentationStyle=UIModalPresentationFormSheet;
          [self presentViewController:navigationController animated:YES completion:nil];
          if([[UIDevice currentDevice] userInterfaceIdiom] != UIUserInterfaceIdiomPhone){
                navigationController.view.superview.frame = CGRectMake(0, 0, 320, 544);
                navigationController.view.frame =CGRectMake(108, 0, 320, 544);
                navigationController.view.superview.backgroundColor=[UIColor clearColor];
          }
  6. 1

    Me fui de esta forma ligeramente distinta el uso de una subclase de navegación controlador y el diseño Automático de Swift, para centrar la vista en el superview en un conjunto de anchura y altura. Mi particular caso de ser necesario el iPad y el iOS7-8 (hay algunas constantes específicas para mi proyecto en este código, pero usted consigue la idea) …

Dejar respuesta

Please enter your comment!
Please enter your name here