UIScrollView与UILabel的布局不明确

时间:2019-04-25 21:51:44

标签: ios autolayout

我正在尝试在代码中设置所有内容。在我的viewController中,我声明了以下属性:

<div class="echo"></div>

和我的viewDidLoad看起来像:

var scrollView: UIScrollView!
var font: UIFont?
var label: UILabel!
var fontSize: CGFloat = 50

因此,如果我在模拟器中运行它,那么它将按预期运行,并且控制台中的布局没有歧义。但是有几件事是行不通的。

如果我将label.text增加到更多这样的段落:

override func viewDidLoad() {
    super.viewDidLoad()

    font = UIFont(name: "HelveticaNeue-UltraLight", size: fontSize)!

    scrollView = UIScrollView()
    scrollView.translatesAutoresizingMaskIntoConstraints = false
    scrollView.backgroundColor = UIColor.lightGray
    view.addSubview(scrollView)

    scrollView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor).isActive = true
    scrollView.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor).isActive = true
    scrollView.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor).isActive = true
    scrollView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor).isActive = true

    label = UILabel(frame: CGRect.zero)
    label.font = font
    label.lineBreakMode = .byWordWrapping
    label.translatesAutoresizingMaskIntoConstraints = false
    label.numberOfLines = 0
    label.text = """
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rutrum urna nec risus dapibus, nec sagittis risus vulputate. Nullam volutpat eros nec sagittis eleifend. Nam sit amet convallis sem, quis tempus quam. Cras egestas est at ipsum tincidunt maximus. Vivamus suscipit justo vel sapien blandit, sed vehicula ipsum euismod. Etiam faucibus tortor at augue ullamcorper, at feugiat lorem varius. Quisque at purus vestibulum, varius ex quis, viverra nibh. Nulla ac porta enim. Nulla egestas mauris a pretium rutrum. Interdum et malesuada fames ac ante ipsum primis in faucibus. Etiam lacinia augue nec augue dictum condimentum. Ut aliquam ac lacus a venenatis. Pellentesque egestas libero sed sem rutrum tempus. Duis posuere turpis at lacinia varius.
"""
    scrollView.addSubview(label)
    label.setContentHuggingPriority(UILayoutPriority(rawValue: 249.0), for: .vertical)
    label.setContentCompressionResistancePriority(UILayoutPriority(rawValue: 751.0), for: .horizontal)
    label.topAnchor.constraint(equalTo: scrollView.topAnchor, constant: 48.0).isActive = true
    label.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 16.0).isActive = true
    label.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -16.0).isActive = true
    label.centerXAnchor.constraint(equalTo: scrollView.centerXAnchor)
    label.bottomAnchor.constraint(equalTo: scrollView.contentLayoutGuide.bottomAnchor, constant: -48.0).isActive = true
}

不再呈现标签。

或者,如果我仅使用一个段落,但将字体大小增加到100,则标签也将不显示

最后,即使标签只有一个段落,字体大小也为50,即使运行正常,如果单击View Debugger,我也会得到“ UIScrollView的可滚动内容大小不明确”。

我是否缺少UILabels和UIScrollViews的东西?我还有其他事件,属性或约束吗?

2 个答案:

答案 0 :(得分:0)

经过一段时间的代码处理后,我发现您遇到了一些问题。

字体无法在模拟器中呈现:

这显然是模拟器错误。我在Xcode 10.2.1 / Mojave 10.14.4上看到了它。文本无法呈现,但标签的大小正确,因此您可以滚动视图并查看垂直指示器的上下移动。即使您指定的系统字体大小大于32,也会发生此问题。在实际设备上(在装有iOS 12.2的iPhone XS上测试),文本将正确呈现。

请在https://bugreport.apple.com上提交有关此问题的错误报告,并提供该问题的示例代码。

UIScrollView的可滚动内容大小不明确:

滚动视图的内容需要固定到滚动视图的每个边缘。您要嵌入的标签的前导约束和尾随约束仅限于根视图,而不是scrollView。它们应该像这样被限制在scrollView中:

label.topAnchor.constraint(equalTo: scrollView.topAnchor, constant: 48.0).isActive = true
label.leadingAnchor.constraint(equalTo: scrollView.leadingAnchor, constant: 16.0).isActive = true
label.trailingAnchor.constraint(equalTo: scrollView.trailingAnchor, constant: -16.0).isActive = true
label.centerXAnchor.constraint(equalTo: scrollView.centerXAnchor).isActive = true
label.bottomAnchor.constraint(equalTo: scrollView.bottomAnchor, constant: -48.0).isActive = true

尽管上述更改将解决内容大小含糊不清的问题,但我建议您一次激活所有约束,因为这样更有效:

NSLayoutConstraint.activate([
  scrollView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor),
  scrollView.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor),
  scrollView.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor),
  scrollView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor),
  label.topAnchor.constraint(equalTo: scrollView.topAnchor, constant: 48.0),
  label.leadingAnchor.constraint(equalTo: scrollView.leadingAnchor, constant: 16.0),
  label.trailingAnchor.constraint(equalTo: scrollView.trailingAnchor, constant: -16.0),
  label.centerXAnchor.constraint(equalTo: scrollView.centerXAnchor),
  label.bottomAnchor.constraint(equalTo: scrollView.bottomAnchor, constant: -48.0)
])

我没有发现contentHuggingPrioritycontentCompressionResistancePriority行是必需的,但是也许您有理由包括这些行。

有了这些更改,模糊的内容警告就消失了。纵向和横向iPhone XS上的布局看起来都是正确的。

答案 1 :(得分:0)

如果只需要可滚动的文本,为什么不只使用uitextview并废弃uilabel和uiscrollview层次结构

相关问题