[Swift] [RESOLU]Calcul de la size des vues dans un UITabBar

DrakenDraken Membre
juillet 2015 modifié dans API UIKit #1

Je suis en train de m'expérimenter avec les délices de la rotation sous iOS 8. A priori c'est tout simple grâce à  la nouvelle méthode viewTransitionToSize de UIViewController



override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
self.redessine(size)
println("redessine Ecran 1 : \(size)")
}


A chaque rotation on reçoit la nouvelle size de la vue. J'ai utilisé ce système dans un UITabBar, avec 3 vues embarqués. A chaque rotation, les vues reçoivent l'événement viewWillTransitionToSize. L'ennui c'est que seule la vue courante sélectionnée dans le TabBar récupère la bonne taille. 


 


Exemple avec la troisième vue sélectionnée dans le tabBar :


Exemple quand je fait une rotation :


 


 



 


size vue 1 : (320.0, 480.0)


size vue 2 : (320.0, 480.0)


size vue 3 : (480.0, 320.0)



 


Je m'attendais à  avoir (480.0, 320.0) partout, alors que seule la vue sélectionnée dans le TabBar reçoit la bonne valeur.


 


 


 


 


Réponses


  • If you override this method in your custom view controllers, always call super at some point in your implementation so that UIKit can forward the size change message appropriately.

    Faut que tu rappelles [super viewWillTransitionToSize: ...] dans ton implémentation.


  • AliGatorAliGator Membre, Modérateur
    juillet 2015 modifié #3
    C'est d'ailleurs étonnant que la méthode ne soit pas marquée "__attribute__((objc_super))" pour l'indiquer au compilateur et qu'il te le signale quand tu as oublié d'appeler "super"... a moins qu'elle le soit mais que tu n'aies pas lu le warning que te remontais le compilo, ou bien que le compilo Swift ne le remonte pas comme il faut ?
  • Aucun warning ! C'est sous Xcode 6.2, une condition imposée pour le MOOC de Jussieu. 


     


    Effectivement je n'avais pas pensé à  reporter l'événement au supérieur. C'est ballot. Merci. Je vais tester ça.

  • Non, cela ne change rien. Ce qui est logique en fait. L'information étant fausse à  la base, la propager au super ne règle rien.


    Je suis en train de télécharger Xcode 6.4. Je verrais bien comment il réagit, lui ..

  • Les vues n'étant pas visibles, elles n'ont pas dû être redimmensionnée par la vue parente.

    Sont-elles bien redimmensionnées quand elles deviennent visibles ?
  • DrakenDraken Membre
    juillet 2015 modifié #7

    Non justement ! C'est là  le problème. Elles conservent l'orientation de leurs créations, même si le device a changé d'orientation. Ce qui donne ce genre d'affichage :


     


    Pour avoir une image correcte, je dois tourner le device, ce qui provoque le bon redimensionnement.

  • DrakenDraken Membre
    juillet 2015 modifié #8

    Quand le redimensionnent est normal, cela donne :

  • DrakenDraken Membre
    juillet 2015 modifié #9

    Problème résolu ! Il suffit de recompiler l'application avec Xcode 6.4 et .. magique ! La TabBar fournit la bonne information aux vues embarquées, pendant les changements d'orientation. 

  • AliGatorAliGator Membre, Modérateur
    juillet 2015 modifié #10
    Bizarre j'ai du mal à  voir en quoi le changement de Xcode changerait quelquechose. Par contre le changement de SDK certainement. Mais ça laisse alors supposer que c'était un bug de iOS 8.2 corrigé en iOS 8.4 et donc que ça posera problème sur les devices qui n'ont pas été mis à  jour... t'as essayé sur un iPhone Sumulator 8.2 ou inférieur ?
  • DrakenDraken Membre
    juillet 2015 modifié #11

    Non, j'ai juste testé sur mon iPod Touch (iOS 8.4). Je vais regarder avec différentes versions du simulateur.


  • Je viens de tester avec les simulateurs iOS 8.0, iOS 8.1 et iOS 8.2 sous Xcode 6.2 et Xcode 6.4. Le bug ne se manifeste que sur les applications compilés avec Xcode 6.2. 

Connectez-vous ou Inscrivez-vous pour répondre.