我正在学习cs193p,我遇到UITextView.sizeThatFits(...)
的问题。它应返回弹出视图的建议大小,以将[int]数组显示为文本。正如你在Paul Hegarty的例子中所看到的那样(https://youtu.be/gjl2gc70YHM?t=1h43m17s),他得到了完全合适的弹出窗口而没有滚动条。我使用的是与本讲座中几乎相同的代码,但我得到了这个:
text
字符串等于[100]
,但sizeThatFits()
方法返回的尺寸太小,无法很好地显示,即使有足够的可用空间。
在我添加了一些文本之后,它会变得更好一些,但仍然不精确并且使用滚动条:
以下是设置大小的代码部分:
override var preferredContentSize: CGSize {
get {
if textView != nil && presentingViewController != nil {
// I've added these outputs so I can see the exact numbers to try to understand how this works
print("presentingViewController!.view.bounds.size = \(presentingViewController!.view.bounds.size)")
print("sizeThatFits = \(textView.sizeThatFits(presentingViewController!.view.bounds.size))")
return textView.sizeThatFits(presentingViewController!.view.bounds.size)
} else { return super.preferredContentSize }
}
set { super.preferredContentSize = newValue }
}
我该怎么做才能以与讲座相同的方式工作?
答案 0 :(得分:1)
看起来标签与其父视图之间有16个边距。返回弹出窗口的首选大小时,您需要考虑到这一点。
您应该尝试以下两种方法:
将32添加到preferredContentSize
在Interface Builder中,清除UILabel
上的布局约束,然后重新添加top,bottom,leading和trailing约束,并确保" Constrain to Margins"选项未启用。
最后,您可以在视图准备好显示时设置preferredContentSize
,而不是覆盖preferredContentSize
,而您可以要求自动布局选择最佳尺寸:
override func viewDidLayoutSubviews() {
self.preferredContentSize = self.view.systemLayoutSizeFitting(UILayoutFittingCompressedSize)
}
如果您的布局配置正确,systemLayoutSizeFitting(UILayoutFittingCompressedSize)
将为您的视图返回尽可能小的尺寸,同时考虑所有边距和子视图。