Swift获取文本视图加载文本后的底部Y坐标问题
解决TextView设置文本后获取正确maxY值的问题
这个问题我之前踩过坑!核心原因是你调用myTextView.frame.maxY的时机太早了——刚设置完文本,iOS的布局系统还没来得及根据内容调整TextView的frame,所以拿到的还是Storyboard里的初始尺寸。给你几个实用的解决办法:
方法一:等待视图布局完成后获取
viewDidLayoutSubviews是视图布局完成后的回调方法,在这里获取frame值才是准确的。不过要注意这个方法会被多次调用(比如屏幕旋转、子视图更新时),可以加个标志位避免重复执行:
private var hasFetchedTextViewMaxY = false override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() // 仅在文本已设置且未获取过值时执行 if !hasFetchedTextViewMaxY, let text = myTextView.text, !text.isEmpty { let updatedMaxY = myTextView.frame.maxY print("TextView更新后的底部Y值:\(updatedMaxY)") hasFetchedTextViewMaxY = true } }
方法二:手动触发布局更新后获取
如果想在设置文本后立刻获取,可以强制让TextView完成布局更新,再读取frame:
let string = " ... Some sentences ... " myTextView.text = string // 强制触发布局更新 myTextView.layoutIfNeeded() // 此时获取的maxY就是文本加载后的准确值 let updatedMaxY = myTextView.frame.maxY print(updatedMaxY)
注意:如果在
viewDidLoad里执行这段代码,可能还是会拿到初始值,因为此时整个ViewController的布局还没完成。建议把这段逻辑放到viewDidAppear(_:)里,或者结合viewDidLayoutSubviews使用。
方法三:手动计算预期高度
如果不想依赖布局系统的回调,也可以直接计算TextView适配文本后的高度,再结合它的Y坐标得到maxY:
let string = " ... Some sentences ... " myTextView.text = string // 计算TextView适配文本的理想尺寸(宽度固定为当前宽度,高度不限) let fittingSize = myTextView.sizeThatFits(CGSize( width: myTextView.bounds.width, height: CGFloat.greatestFiniteMagnitude )) // 初始Y坐标加上计算出的高度,就是底部Y值 let updatedMaxY = myTextView.frame.origin.y + fittingSize.height print(updatedMaxY)
内容的提问来源于stack exchange,提问作者WhatsMyPurpose
相关产品推荐
相关产品推荐

