19

Ho un problema con iOS 7 che sembra essere un bug o semplicemente non faccio qualcosa di giusto. Ho modalViewController che appare come un popover su iPad con ModalPresentationStyle. E non è di dimensioni standard, dimensioni personalizzate. ecco il codice:Popover con ModalPresentationStyle non è centrato in iOS 7 iPad

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); 

E 'tutto bene lavorare in iOS 6, ma in iOS 7 non è centrato. Ma se imposto ModalTransitionStyle su UIModalTransitionStyleCrossDissolve, funziona correttamente. Ma solo in questa modalità. Forse qualcuno è inciampato anche su questo e sa come ripararlo? Non sono un grande fan dell'effetto dissolvenza. Grazie.

risposta

2

Ho un metodo in cui la vecchia abitudine dal presentation style fromsheet funziona con iOS <=7 sebbene sia possibile impostare custom height and width.

Tenete a mente che questo metodo potrebbe non funzionare in qualsiasi versione più recente in 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(); 
    }); 
} 
+0

Accetterò questa risposta poiché questo funziona per me, almeno per ora . Anche se ho finito con l'utilizzo di MZFormSheetController - è davvero una fantastica soluzione in stile iOS 7, funziona per me in entrambe le versioni ios. Anche se mi piacerebbe davvero capire in un futuro come gestirlo con il kit ios nativo, sembra un bug per ora. – titicaca

+0

hey non funziona è solo mostra pop-up e di nuovo a schermo intero. qualsiasi idea al riguardo http://stackoverflow.com/questions/30615075/preferredcontentsize-not-working-in-ios-7 – Sandy

4

È lo stesso per me ... Non so ancora come risolverlo. Al momento sto lavorando a quel problema, quindi tutto quello che otterrò lo condividerò!

Questo è il mio codice.

-(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; 

}

+0

Hey Manuel, hai trovato qualche soluzione? – titicaca

+0

Ehi! la soluzione di @ Tamara Bernad funziona davvero bene. Provalo. Non posso votare come uno buono perché non ho ancora una reputazione :( –

+0

Sfortunatamente, non ha funzionato bene per me, posiziona il popover al centro, ma non è la mia dimensione, è solo una finestra popover di dimensioni standard con le mie cose centrato al suo interno .. – titicaca

39

Ho avuto lo stesso problema. Ho risolto questo problema utilizzando un altro approccio, trovato here.

Cosa questa soluzione si propone è quello di utilizzare il metodo (void)viewWillLayoutSubviews

Quindi, in caso di @Manuel M. all'interno della GeneralSettingsViewController aggiungere il codice qui sotto:

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

e non avrete più bisogno di questo codice :

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

Per @titicaca, si utilizza un UINavigationController non ho prova con questo controller, ma si potrebbe provare t la stessa soluzione che ho citato, che estende lo UINavigationController e sovrascrive il metodo viewWillLayoutSubviews.

[EDIT]

Per @titicaca ho provato in un nuovo progetto e per me ha funzionato. Quello che ho fatto stava avendo un controller personalizzato vista di navigazione CustomNavigationController sovrascrivendo il viewWillLayoutSubviews in questo modo:

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

Quindi, il controller della vista che presenta la CustomNavigationController dovrebbe eseguire un codice simile a questo:

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]; 

È necessario per essere sicuro che le dimensioni dello self.view.superview.bounds = CGRectMake(0, 0, 330, 284); siano numeri pari, altrimenti il ​​testo all'interno diventa sfocato, se c'è qualche

+0

Mi chiedevo se qualcuno potesse spiegare perché a) la proprietà 'view.superview.bounds' deve essere chiamata per risolvere questo problema, e b) come passare in (0,0) per l'origine del retto lo fa centrare? –

+0

Ho trovato 'viewWillAppear:' è un posto ancora migliore in cui inserire 'self.view.superview.bounds = xxx' dato che è chiamato prima di' viewWillLayoutSubviews' – wangii

5

Per me la questione è stata chiamata becomeFirstResponder su un campo di testo nel viewDidAppear del controller della vista presentato. Sembra essere un bug con quello ora. La soluzione è stata avvolgendolo in una semplice dispatch_async:

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

La soluzione di cui sopra non ha funzionato per me. Ho usato il seguente:

 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]; 
     } 
1

Sono andato su questi leggermente diverso utilizzando un controller di navigazione sottoclasse e AutoLayout in Swift, per centrare la vista nel superview ad una larghezza impostata ed altezza. Il mio caso particolare bisogno di iPad e il supporto iOS7-8 (c'è qualche costanti specifiche per il mio progetto in questo codice, ma si ottiene l'idea) ...

class CenteredModalNavigationController: UINavigationController { 

    // MARK:- Methods 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     preferredContentSize = CGSizeMake(320, 480) // iOS8 only 
    } 

    override func viewWillAppear(animated: Bool) { 
     super.viewWillAppear(animated) 

     // iOS7 support for iPad custom sized form-sheet modal. 
     if kDeviceiOS7 && kDeviceiPad { 
      if view.superview == nil { 
       Log.warning("Failed to find superview") 
       return 
      } 
      view.superview!.setTranslatesAutoresizingMaskIntoConstraints(false) 

      // Give the superview constraints to center the view inside it. 
      var viewBindingsDict: NSMutableDictionary = NSMutableDictionary() 
      viewBindingsDict.setValue(view, forKey: "view") 
      viewBindingsDict.setValue(view.superview!, forKey: "superview") 
      let centerXConstraints = NSLayoutConstraint.constraintsWithVisualFormat("V:[superview]-(<=1)-[view]", 
       options: .AlignAllCenterX, 
       metrics: nil, 
       views: viewBindingsDict) 
      view.superview!.addConstraints(centerXConstraints) 

      let centerYConstraints = NSLayoutConstraint.constraintsWithVisualFormat("H:[superview]-(<=1)-[view]", 
       options: .AlignAllCenterY, 
       metrics: nil, 
       views: viewBindingsDict) 
      view.superview!.addConstraints(centerYConstraints) 

      // Now give it a width/height and it should float in the middle of our superview. 
      AutoLayoutHelper.addWidthConstraint(view, 
       aSuperView: view.superview!, 
       width: 320) 
      AutoLayoutHelper.addHeightConstraint(view, 
       aSuperView: view.superview!, 
       height: 480) 
     } 
    } 

    override func prefersStatusBarHidden() -> Bool { 
     return true 
    } 

    override func disablesAutomaticKeyboardDismissal() -> Bool { 
     // DEVNOTE: Because this is shown in a modal, this is required to stop keyboard dismiss issues. 
     return true 
    } 

} 

...

class AutoLayoutHelper: NSObject { 

    class func addHeightConstraint(aChildView:UIView, aSuperView:UIView, height:CGFloat) { 
     var constraint = NSLayoutConstraint(item: aChildView, 
      attribute: NSLayoutAttribute.Height, 
      relatedBy: NSLayoutRelation.Equal, 
      toItem: nil, 
      attribute: NSLayoutAttribute.NotAnAttribute, 
      multiplier: 1.0, 
      constant: height) 
     aSuperView.addConstraint(constraint) 
    } 

    class func addWidthConstraint(aChildView:UIView, aSuperView:UIView, width:CGFloat) { 
     var constraint = NSLayoutConstraint(item: aChildView, 
      attribute: NSLayoutAttribute.Width, 
      relatedBy: NSLayoutRelation.Equal, 
      toItem: nil, 
      attribute: NSLayoutAttribute.NotAnAttribute, 
      multiplier: 1.0, 
      constant: width) 
     aSuperView.addConstraint(constraint) 
    } 

} 
Problemi correlati