view.traitCollection.horizontalSizeClass devolviendo undefined (0) en viewDidLoad

Estoy usando una UITextView dentro de un UIPageViewController, y quiero determinar el tamaño de fuente en function de la class de tamaño del dispositivo.

La primera diapositiva de la vista de página se carga en ViewDidLoad como tal ( viewControllerAtIndex(0) ):

 override func viewDidLoad() { super.viewDidLoad() //Some unrelated code here // Page View Controller for Questions Slider questionPageVC = storyboard?.instantiateViewControllerWithIdentifier("QuestionPageView") as? UIPageViewController questionPageVC!.dataSource = self; questionPageVC!.delegate = self; let startingViewController : QuestionContentViewController = viewControllerAtIndex(0) as QuestionContentViewController var viewControllers = [startingViewController] questionPageVC!.setViewControllers(viewControllers, direction: .Forward, animated: true, completion: nil) let sliderHeight = view.frame.size.height * 0.5 questionPageVC!.view.frame = CGRectMake(20, 70, view.frame.size.width-40, sliderHeight) addChildViewController(questionPageVC!) view.addSubview(questionPageVC!.view!) questionPageVC?.didMoveToParentViewController(self) var pageControl : UIPageControl = UIPageControl.appearance() pageControl.pageIndicatorTintColor = UIColor.lightGrayColor() pageControl.currentPageIndicatorTintColor = UIColor.blackColor() pageControl.backgroundColor = UIColor.whiteColor() // Some more code here } 

Y luego, en viewControllerAtIndex:

 private func viewControllerAtIndex(index: Int) -> QuestionContentViewController { var pcvc : QuestionContentViewController = storyboard?.instantiateViewControllerWithIdentifier("QuestionContentView") as! QuestionContentViewController var fontSize = "" if (view.traitCollection.horizontalSizeClass == UIUserInterfaceSizeClass.Compact) { fontSize = "20" } else { fontSize = "28" } pcvc.questionString = TextFormatter(string: fontSize + questionsArray[index]).formattedString pcvc.questionIndex = index return pcvc } 

El problema es que la primera diapositiva, que se llamó en viewDidLoad, siempre usa el tamaño de fuente en la cláusula "else".

Si view.traitCollection.horizontalSizeClass , para esa primera diapositiva, obtengo 0 ( UIUserInterfaceSizeClassUnspecified ), para las diapositivas posteriores, obtengo el tamaño correcto.

Intenté mover todo el asunto a "viewWillAppear", y luego suceden cosas extrañas al UIPageViewController (una diapositiva adicional con el text del tamaño incorrecto detrás de las otras diapositivas)

El problema es que viewDidLoad es demasiado pronto para preguntar sobre la colección de rasgos de una vista. Esto se debe a que la recostackción de rasgos de una vista es una característica adquirida de la jerarquía de vistas, el entorno en el que se encuentra. Pero en viewDidLoad , la vista no tiene entorno: todavía no está en la jerarquía de vistas. Se ha cargado , lo que significa que existe: el controller de vista ahora tiene una vista. Pero aún no se ha puesto en la interfaz, y no se colocará en la interfaz hasta después de viewWillAppear: que viene más adelante en la secuencia de events.

Sin embargo, el controller de vista también tiene una colección de características y tiene un entorno: cuando se llama a viewDidLoad , el controller de vistas es parte de la jerarquía del controller de vistas. Por lo tanto, la solución más simple (y correcta) es solicitar el traitCollection de self , no de view . Simplemente diga self.traitCollection donde ahora tiene view.traitCollection , y todo estará bien.

(Es posible que su solución, que le pide a la pantalla su colección de rasgos, funcione, pero no es confiable y no es el enfoque correcto. Esto se debe a que es posible que el controller de vista padre modifique la colección de rasgos de su hijo y si omite el enfoque correcto y pregunta directamente a la pantalla, no obtendrá la colección de características correcta).

Descubrí que si utilizo la traitCollection de la pantalla principal, en lugar de la vista actual, obtengo la class de tamaño correcta:

 if (UIScreen.mainScreen().traitCollection.horizontalSizeClass == UIUserInterfaceSizeClass.Compact) { fontSize = "20" } else { fontSize = "28" } 

Será mejor que mueva ese código al método viewWillAppear, ya que en la vistaDidLoad, la vista ViewController aún no se ha agregado a la jerarquía, y es posible que obtenga una colección de rasgos vacía.