为什么sizeThatFits()返回的尺寸太小?

时间:2017-01-29 22:13:34

标签: ios swift cocoa-touch

我正在学习cs193p,我遇到UITextView.sizeThatFits(...)的问题。它应返回弹出视图的建议大小,以将[int]数组显示为文本。正如你在Paul Hegarty的例子中所看到的那样(https://youtu.be/gjl2gc70YHM?t=1h43m17s),他得到了完全合适的弹出窗口而没有滚动条。我使用的是与本讲座中几乎相同的代码,但我得到了这个:

enter image description here

text字符串等于[100],但sizeThatFits()方法返回的尺寸太小,无法很好地显示,即使有足够的可用空间。 在我添加了一些文本之后,它会变得更好一些,但仍然不精确并且使用滚动条:

enter image description here

以下是设置大小的代码部分:

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 }
}

我该怎么做才能以与讲座相同的方式工作?

1 个答案:

答案 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)将为您的视图返回尽可能小的尺寸,同时考虑所有边距和子视图。