2016-09-19 1 views
1

J'utilise un UISplitViewController et à mon avis de détail, je suis en train d'utiliser willTransitionToTraitCollection:withTransitionCoordinator: pour changer la visibilité d'un point de vue couple lorsque les changements verticaux de classe de taille à Compact.willTransitionToTraitCollection pas appelé le premier changement quand UISplitViewController preferredDisplayMode est Overlay

Sur seulement l'iPhone (non iPhone Plus ou iPad) Si je change le preferredDisplayMode-UISplitViewControllerDisplayModePrimaryOverlay, willTransitionToTraitCollection:withTransitionCoordinator: n'est pas appelé la première fois que le dispositif est mis en rotation, mais willTransitionToSize:withTransitionCoordinator: est. Si je mets preferredDisplayMode à autre chose cela fonctionne très bien. Si vous faites pivoter l'appareil avant de sélectionner un élément dans la liste principale, cela fonctionne très bien. C'est seulement sur la première rotation du portrait au paysage.

Ceci est facilement reproduit en utilisant le modèle maître-détail:

AppDelegate:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
    // Override point for customization after application launch. 
    UISplitViewController *splitViewController = (UISplitViewController *)self.window.rootViewController; 

    // ******** Add this ******** 
    [splitViewController setPreferredDisplayMode:UISplitViewControllerDisplayModePrimaryOverlay]; 

    UINavigationController *navigationController = [splitViewController.viewControllers lastObject]; 
    navigationController.topViewController.navigationItem.leftBarButtonItem = splitViewController.displayModeButtonItem; 
    splitViewController.delegate = self; 
    return YES; 
} 

Dans DetailViewController, ajoutez les implémentations viewWillTransitionToTraitCollection et viewWillTransitionToSize et points d'arrêt:

- (void)willTransitionToTraitCollection:(UITraitCollection *)newCollection withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator 
{ 
    [super willTransitionToTraitCollection:newCollection withTransitionCoordinator:coordinator]; 
} 

- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator 
{ 
    [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator]; 
} 

Vous allez voir que willTransitionToSize: est toujours appelé, mais willTransitionToTraitCollection: n'est pas appelé pour le premier tra nition.

Est-ce que quelqu'un sait pourquoi c'est? J'ai l'impression que c'est un bug, mais je voulais voir si quelqu'un avait une explication avant d'envoyer un rapport de bug dans le trou noir d'Apple.

Répondre

-1

setPreferredDisplayMode fait toute la charge de vues, alors vous devriez l'appeler dernier.

+0

Ce n'est pas vrai. L'iPhone a une largeur et une hauteur compactes en mode paysage, mais il a une largeur compacte et une hauteur régulière en mode portrait, de sorte que la fonction TransitionToTraitCollection doit être appelée à chaque rotation de périphérique. En outre, si tel était le cas, cela ne serait jamais appelé (comme sur iPad), mais il est appelé à chaque rotation de périphérique APRÈS le premier, et cela se produit uniquement dans la situation que j'ai décrite à l'origine. –

+0

@JordanBondo pouvez-vous jeter un oeil à ma réponse mise à jour – malhal