ios - view.traitCollection.horizo​​ntalSizeClass 在 vi​​ewDidLoad 中返回 undefined (0)

标签 ios swift

我在 UIPageViewController 中使用 UITextView,我想根据设备的大小类别确定字体大小。

页面 View 的第一张幻灯片像这样加载到 ViewDidLoad 中 (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
}

然后,在 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

}

问题是在 viewDidLoad 中调用的第一张幻灯片总是使用“else”子句中的字体大小。

如果我打印 view.traitCollection.horizo​​ntalSizeClass,对于第一张幻灯片,我得到 0 (UIUserInterfaceSizeClassUnspecified),对于后续幻灯片,我得到正确的大小。

我尝试将整个内容移动到“viewWillAppear”,然后 UIPageViewController 发生了奇怪的事情(在其他幻灯片后面有一个带有错误大小文本的额外幻灯片)

最佳答案

问题是 viewDidLoad 询问 View 的特征集合还为时过早。这是因为 View 的特征集合是从 View 层次结构中获取的特征, View 层次结构是它所在的环境。但是在 viewDidLoad 中, View 没有环境:它还不 View 层次结构中。它已经加载,这意味着它存在: View Controller 现在一个 View 。但是它还没有被放入界面,直到 viewDidAppear: 才会被放入界面,这在事件的顺序中是靠后的。

然而, View controller 也有一个 trait 集合,它确实有一个环境:在调用 viewDidLoad 时, View Controller 是 View Controller 层次结构的一部分。因此,最简单(也是正确)的解决方案是请求selftraitCollection,而不是viewtraitCollection。只需在您现在拥有 view.traitCollection 的地方说出 self.traitCollection,一切都会好起来的。

(您的解决方案,向屏幕询问其特征集合,可能碰巧有效,但它不可靠,也不是正确的方法。这是因为父 View Controller 有可能改变其 child 的特征集合,如果你绕过正确的方法并直接询问屏幕,你将无法获得正确的特征集合。)

关于ios - view.traitCollection.horizo​​ntalSizeClass 在 vi​​ewDidLoad 中返回 undefined (0),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30007701/

相关文章:

ios - 除非正在编辑 subview 内的 textView,否则 TabViewController 中的 RightBarItem 不会触发

ios - 定位 ARKIT 模型

ios - 引用/更改节点的大小(在调用它之后)

ios - 在 Swift 和 AVPlayer 中显示音频流的图稿?

ios - 为什么我的 update() 函数对 dB 水平没有反应?

ios - NotificationCenter 没有调用选择器

ios - CollectionUIView重新加载数据在获取数据后不更新显示

ios - Swift 关闭然后打开导致加载两次

ios - CoreData - 使用获取的 Controller 的行数无效

ios - UITableView 布局在第一次加载时设置动画