问题描述
所以我试图获取 lineFragment
中每一行的 UITextView's NSLayoutManager
大小。在第一次加载时,它提供大于 textView 布局的值。
我有一个文本视图,它使用自动布局填充 ViewControllers 视图。
一个基本的例子是这样的:
let demotext = """ <Multiline String> """
override func viewWillAppear(_ animated: Bool) {
textview.text = demotext
}
func size(text: String) {
let layoutManager = textview.layoutManager
let numberOfGlyphs = layoutManager.numberOfGlyphs
var currentGlyph = 0
while currentGlyph < numberOfGlyphs {
var glyphRange = NSRange()
let linesize = layoutManager.lineFragmentUsedRect(forGlyphAt: currentGlyph,effectiveRange: &glyphRange)
print("linesize: \(linesize)")
currentGlyph = NSMaxrange(glyphRange)
}
}
我尝试将调用置于 viewDidLoad
、viewDidLayoutSubviews
、viewWillAppear
中,并且还编写了一个委托(仅当您将 allowsNonContiguousLayout
设置为 false 时才有效)以对 { 做出反应{1}}。
第一次启动后第一行的输出如下:layoutManager(_ layoutManager: didCompleteLayoutFor: atEnd:)
向右和向后旋转一次结果:linesize: (0.0,0.0,125.6982421875,16.70703125)
线条比设备宽度短,因此旋转一次横向就足够了(大小相同)。
我想我错过了一些基本的东西。知道它是什么吗?
谢谢
Edit:// 以编程方式创建 textview 而不是 IB 解决了这个问题。但我仍在试图弄清楚,为什么使用 IB 会导致这种行为。
Edit2:// 这个问题在 macOS 上不会出现,只是在 iOS 上
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)