You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift:获取UILabel最后一个字符CGPoint以实现UIScrollView自动滚动

解决UIScrollView滚动到UILabel最后一个字符位置的问题

你的问题出在range(of:)这个方法上——它只会返回目标字符第一次出现的位置,而不是最后一次。如果你的字符串里有重复字符,这就会导致计算出来的前缀宽度完全错误,自然滚动位置就不对了。

给你两种解决方案,根据你的实际需求选:

方案1:获取最后一个字符的起始X坐标

如果你确实需要定位到最后一个字符的起始位置,可以直接截取除最后一个字符外的前缀来计算宽度,完全不用range(of:):

guard let labelText = mylabel.text, !labelText.isEmpty else { return }

// 截取去掉最后一个字符的前缀
let prefixWithoutLastChar = String(labelText.dropLast())
// 计算前缀的尺寸(注意用和Label一致的字体)
let prefixSize = prefixWithoutLastChar.size(withAttributes: [.font: UIFont.systemFont(ofSize: 35.0)])
// 前缀的宽度就是最后一个字符的起始X坐标
let targetOffset = CGPoint(x: prefixSize.width, y: 0)
myScrollView.setContentOffset(targetOffset, animated: true)

方案2:滚动到文本最右端(让最后部分可见)

如果你的需求是让UILabel的末尾内容显示在ScrollView的可视区域里,直接计算整个文本的总宽度,再根据ScrollView的可视宽度调整偏移量更合理:

guard let labelText = mylabel.text, !labelText.isEmpty else { return }

// 计算整个文本的尺寸
let fullTextSize = labelText.size(withAttributes: [.font: UIFont.systemFont(ofSize: 35.0)])
// 计算需要滚动的偏移量:如果文本宽度超过ScrollView宽度,就滚到最右边;否则不滚动
let targetOffsetX = max(0, fullTextSize.width - myScrollView.bounds.width)
let targetOffset = CGPoint(x: targetOffsetX, y: 0)
myScrollView.setContentOffset(targetOffset, animated: true)

这两种方法都能避免原代码中重复字符导致的定位错误,你可以根据自己的实际场景来选择~

内容的提问来源于stack exchange,提问作者saam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:41:51