我在 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.horizontalSizeClass
,对于第一张幻灯片,我得到 0 (UIUserInterfaceSizeClassUnspecified
),对于后续幻灯片,我得到正确的大小。
我尝试将整个内容移动到“viewWillAppear”,然后 UIPageViewController 发生了奇怪的事情(在其他幻灯片后面有一个带有错误大小文本的额外幻灯片)
最佳答案
问题是 viewDidLoad
询问 View 的特征集合还为时过早。这是因为 View 的特征集合是从 View 层次结构中获取的特征, View 层次结构是它所在的环境。但是在 viewDidLoad
中, View 没有环境:它还不在 View 层次结构中。它已经加载,这意味着它存在: View Controller 现在有一个 View 。但是它还没有被放入界面,直到 viewDidAppear:
才会被放入界面,这在事件的顺序中是靠后的。
然而, View controller 也有一个 trait 集合,它确实有一个环境:在调用 viewDidLoad
时, View Controller 是 View Controller 层次结构的一部分。因此,最简单(也是正确)的解决方案是请求self
的traitCollection
,而不是view
的traitCollection
。只需在您现在拥有 view.traitCollection
的地方说出 self.traitCollection
,一切都会好起来的。
(您的解决方案,向屏幕询问其特征集合,可能碰巧有效,但它不可靠,也不是正确的方法。这是因为父 View Controller 有可能改变其 child 的特征集合,如果你绕过正确的方法并直接询问屏幕,你将无法获得正确的特征集合。)
关于ios - view.traitCollection.horizontalSizeClass 在 viewDidLoad 中返回 undefined (0),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30007701/