【发布时间】:2026-01-08 04:25:01
【问题描述】:
我在其中一个视图中添加了一个滚动视图子视图,但无法使其高度准确地适合滚动视图显示的内容,即 UILabel 中的文本。高度需要是动态的(即文本长度的一个因素),因为我正在为许多不同的文本长度实例化这个视图。每当我登录 label.frame.bounds 时,我都会返回 (0,0)。我也在几个地方尝试过sizeToFits(),但运气不佳。
我的目标是让滚动视图在到达最后一行文本时结束。另外,我只使用编程约束。
我的代码的精简版如下:
import UIKit
class ViewController: UIViewController, UIScrollViewDelegate {
let scrollView = UIScrollView()
let containerView = UIView()
let label = UILabel()
override func viewDidLoad() {
super.viewDidLoad()
scrollView.delegate = self
// This needs to change
scrollView.contentSize = CGSize(width: 375, height: 1000)
scrollView.addSubview(containerView)
view.addSubview(scrollView)
label.text = unknownAmountOfText()
label.backgroundColor = .gray
containerView.isUserInteractionEnabled = true
containerView.addSubview(label)
label.translatesAutoresizingMaskIntoConstraints = false
label.topAnchor.constraint(equalTo: containerView.topAnchor).isActive = true
label.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
scrollView.frame = view.bounds
containerView.frame = CGRect(x: 0, y: 0, width: scrollView.contentSize.width, height: scrollView.contentSize.height)
}
}
感谢任何帮助。
找到解决方案:
func heightForLabel(text: String, font: UIFont, lineHeight: CGFloat, width: CGFloat) -> CGFloat {
let label:UILabel = UILabel(frame: CGRect(x: 0, y: 0, width: width, height: CGFloat.greatestFiniteMagnitude))
label.numberOfLines = 0
label.lineBreakMode = NSLineBreakMode.byWordWrapping
label.font = font
label.text = text
label.setLineHeight(lineHeight: lineHeight)
label.sizeToFit()
return label.frame.height
}
我在网上找到了这个解决方案,它为我提供了根据标签高度为 scrollView 高度设置适当内容大小所需的内容。理想情况下,如果没有这个功能,我可以确定这一点,但现在我很满意。
【问题讨论】:
-
您为什么要以编程方式而不是在界面生成器中执行此操作?处理这个问题的最简单方法是使用布局约束,尽管这在代码中会很快变得丑陋。
-
为什么要把 UILabel 放到 UIScrollView 中,然后尝试调整滚动视图的大小以适应标签?你想滚动吗?如果是这样,为什么要调整滚动视图的大小?如果您不想滚动,为什么要将标签放在滚动视图中?
-
我想尝试一个只有程序化布局的项目。我想在我的下一个项目中,我将使用界面生成器。但就目前而言,我对这个项目的切换太深了,所以我确实需要以编程方式解决这个问题。
-
我确实想要滚动。文本可能比屏幕上可以容纳的大,所以在这种情况下,我希望用户能够滚动浏览文本。我需要在某个时候弄清楚文本的大小才能确定滚动视图的大小。
-
好吧,还是有点混乱……你的目标是拥有一个“框架”的 ScrollView 吗?因此,如果文本很短,并且可能只需要屏幕高度的 1/4,那么您希望在标签周围有一个屏幕高度 1/4 的可见框架?如果文本有点多,所以它是 3/4 高度,你希望可见框架占据屏幕的 3/4 吗?如果文本是屏幕的两倍高,那么可见框架是全屏,文本滚动?
标签: ios swift uiscrollview uikit uiscrollviewdelegate