获取 UITextView 中滚动后可见文本的 NSRange

2024-01-22

我正在尝试将滚动文本的位置保存在UITextView这样我就可以在加载时返回到该位置ViewController再次。我有很长的字符串,所以我希望用户能够滚动到特定位置,然后稍后返回到该位置。

我正在使用UITextView。 scrollRangeToVisible 函数自动滚动文本视图,但我不知道如何获取用户正在看到的文本的 NSRange。这是解决这个问题的最佳方法吗?我尝试使用setContentOffset功能,但似乎没有做任何事情。

任何帮助表示赞赏。谢谢!


这里有一个小扩展UITextView使用它的characterRange(at:)函数代替。它还添加了一个计算属性来返回当前可见的文本:

extension UITextView {

    private var firstVisibleCharacterPosition: UITextPosition? {
        // ⚠️ For some reason `characterRange(at:)` returns nil for points with a low y value.
        guard let scrolledPosition = characterRange(at: contentOffset)?.start else {
            return beginningOfDocument
        }
        return scrolledPosition
    }

    private var lastVisibleCharacterPosition: UITextPosition? {
        return characterRange(at: bounds.max)?.end
    }

    /// The range of the text that is currently displayed within the text view's bounds.
    var visibleTextRange: UITextRange? {

        guard
            let first = firstVisibleCharacterPosition,
            let last = lastVisibleCharacterPosition else {
                return nil
        }

        return textRange(from: first, to: last)
    }      

    /// The string that is currently displayed within the text view's bounds.
    var visibleText: String? {
        guard let visibleTextRange = visibleTextRange else {
            return nil
        }
        return text(in: visibleTextRange)
    }

}

我在上面的代码中使用了这些简写属性:

extension CGRect {

    var min: CGPoint {
        return .init(x: minX, y: minY)
    }

    var max: CGPoint {
        return .init(x: maxX, y: maxY)
    }

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

获取 UITextView 中滚动后可见文本的 NSRange 的相关文章

  • 设置/覆盖 UICollectionView 中单元格之间的填充

    我有一个 UICollectionView 但在获取单元格之间的填充时遇到了问题 理论上 我应该能够将屏幕除以 4 并且我可以获得包含 4 个图像的单元格大小 完美地占据屏幕宽度 但是 它选择不这样做 相反 它会创建 3 个具有巨大填充的图
  • iOS - 当 UIView 移动时将 UITextField 移动到不同的位置

    我有一个主 UIView 它通过开关向上移动 我有这个工作 那里没有问题 现在 UIView 当向下时 占据屏幕的大约一半 当它向上推时 它会显示底部 40px 在 UIView 中 当它处于向下状态时 它有一个 UITextField 并
  • Swift:如何减少 didupdatelocations 调用

    我想出了一些代码来打印我所在位置的地址和邮政编码 这是在 didupdatelocation 函数中完成的 我遇到的唯一问题是 didupdatelocation 函数每秒都会更新该地址 因为这电池效率非常低 所以我一直在寻找使用间隔的方法
  • 在 IOS 上使用 AVComposition 混合两个音频文件

    我正在尝试混合两个音频文件 将一个音频文件放在另一个音频文件之上 不是缝合在一起 但我在 IOS 上学习 AVFoundation 时遇到了困难 我在这里遵循了这个答案 如何使用 AVMutableCompositionTrack 合并音频
  • 从命令行调试 iOS 应用程序构建

    我正在通过命令行构建 iOS 应用程序 但在调试它时遇到问题 如果我使用 XCode 进行构建 它会让我在设备上 构建和调试 而不会出现任何问题 但现在 我不知道如何使用 gdb 在设备上启动它并逐步执行它 如果我尝试 添加自定义目标 可执
  • 在 SwiftUI 中使用分段式选取器在两个页面之间滑动

    我有一个Picker with pickerStyle SegmentedPickerStyle 使其成为分段控件 我想让页面在之间平滑滑动 而不是使用条件语句替换视图 这是我迄今为止所做的 gif 这是到目前为止的代码 由if 而不是在不
  • 如何防止Apple Watch进入睡眠状态?

    我们正在开发一个 Apple Watch 项目 但如果不被打扰 手表就会进入睡眠状态 有什么办法可以阻止它进入睡眠状态吗 据我所知和有关该主题的其他搜索 目前还没有api可通过编程方式启用或禁用 Apple Watch 的睡眠模式
  • 如何解决 CoreData mogenerator 未找到问题

    我收到如下所示的错误 我不知道我错过了什么 我该如何解决这个问题 如下图所示 Users nischalhada Documents XcodePro mnepalnews revisited 2 0 CoreData mogenerato
  • 错误域=AVFoundationErrorDomain代码=-11814“无法记录”

    它不断给我错误 错误域 AVFoundationErrorDomain代码 11814 无法记录 我不确定问题是什么 我试图在拍照后计数器达到 1 时录制声音 static int counter counter will always b
  • iOS 滚动视图允许滚动过去的内容

    我正在努力优化我的应用程序以适应横向和较小的屏幕 我主要使用滚动视图来实现这一点 在我的其中一个视图中 我有一个容器视图 当我在故事板中的设备之间切换时 这个容器视图看起来很完美 容器视图映射到具有滚动视图的视图控制器 该滚动视图的顶部 底
  • 添加自定义过渡会导致 xib 加载错误的屏幕尺寸

    我正在尝试向具有 xib 的 UIViewController 添加自定义过渡 我尝试了几种方法 但它们都有相同的问题 视图显示的屏幕尺寸错误 我当前的示例基于以下教程 使用 Swift 在 iOS 中自定义 UIViewControlle
  • 在真实设备上展示测试广告

    这是我的代码 let request GADRequest request testDevices kGADSimulatorID XXXX2F32d69CCA859FFB559D0FEA3CF6483D08A6 adView load r
  • 错误:更改核心数据模型后架构armv7的重复符号

    我有一个使用核心数据框架的应用程序 我工作得很好 我刚刚更改了数据模型 向一个实体添加一个属性 当我尝试构建它时 出现错误 duplicate symbol OBJC METACLASS AccountFolder in Users XXX
  • iOS:提高图像绘制速度

    我有一系列想要制作动画的图像 UIImageView支持一些基本的动画 但不足以满足我的需求 我的第一个方法是使用UIImageView并设置image当图像属性 这太慢了 速度慢的原因是图像的绘制 这让我感到惊讶 我以为瓶颈会加载图像 我
  • Xcode 中的 iOS 9 警告 - 此文件设置为针对早于项目部署的版本进行构建。功能可能有限

    我刚刚将我的 Mac 更新到最新的操作系统 并将 Xcode 更新到最新版本 现在我收到此警告 但我不知道该由谁来删除它 也不知道它的真正含义是什么 有人可以向我解释一下吗 Thanks Select Main storyboard in
  • 检测 AvPlayer 何时切换比特率

    在我的应用程序中 我使用 AVPlayer 通过 HLS 协议读取一些流 m3u8 文件 我需要知道在流会话期间 客户端切换比特率多少次 我们假设客户端的带宽正在增加 因此客户端将切换到更高比特率的段 AVPlayer能检测到这个开关吗 T
  • iphone:如何停止快门动画?

    我有两个问题 1 我想知道如何在相机加载时停止快门动画 我正在使用 UIImagePickerController 我已经参考了堆栈溢出的许多答案 但没有成功 2 我在相机中有一个自定义按钮 使用cameraOverlayView并想通过单
  • 苹果企业程序分发问题[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 这个问题涉及到Apple iOS 开发者企业计划 http developer apple com programs ios enterprise 我
  • 如何反转 CGPath 的点顺序

    我想画一个圆圈 并用它打出字母 为此 我需要顺时针抚摸圆圈 逆时针抚摸字母 这一切都很好 但是当我使用 Core Text 获取字母路径时 我不知道如何从本质上反转该路径 不是镜像或旋转或任何东西 这很简单 我希望点笔画顺序是逆时针的 这实
  • Swift 中的 UIAlert 自动消失?

    我有以下代码 Creates Alerts on screen for user func notifyUser title String message String gt Void let alert UIAlertController

随机推荐

  • Imagemagick“mogrify -strip”-更改图像?

    In my 最后一个问题 https stackoverflow com questions 24683912 imagemagick depth convert询问转换和位深度 所以 这样做 convert in png out eps
  • 各种 .NET Framework 版本的操作系统兼容性

    每个 Net 框架的最低操作系统要求是什么 例如 对于哪个版本不可能运行每个操作系统 视窗95 视窗98 视窗98SE 视窗ME Windows NT 3 x 视窗NT 4 视窗2000 我相信所有 Net 框架都与 XP Vista Wi
  • 如何使用 Eclipse RCP 的打印选项打印 jasper 报告?

    我的问题 我在 Eclipse RCP 应用程序中有一个 ViewerComposite 它显示集成到其中的 Jasper Report jrxml 此 ViewerComposite 中显示的报告可以导出为 PDF RTF XML jrx
  • Krakenex API 多对查询

    我正在尝试使用 Krakenex python 库一次查询多个货币对的订单簿 当我对单一货币执行此操作时 这是有效的 如下所示 con krakenex API con load key kraken key con query publi
  • 创建一个处理 DatabaseFactory 的 DbContext 以更轻松地使用 DapperExtensions

    这几天我尝试使用一些基本的 CRUD 函数创建一个抽象的基础存储库简洁的扩展 https github com tmsmith Dapper Extensions 但作为示例给出的代码使用 SqlConnection 来连接到 SQL Se
  • .NET Core 项目与 .NET Framework 中为 System.Data.DataTable 生成的 JSON 的变化

    下面的程序在 NET Core 项目与 NET Framework 应用程序中运行时生成不同的 JSON Code class Program internal static readonly MediaTypeFormatter Defa
  • openlayers3如何始终启用徒手绘制

    在 OpenLayers3 v3 5 中 如何始终启用徒手绘制 默认启用徒手绘制是通过freehandCondition的财产ol interaction Draw 当前默认设置为 Shift 键 draw new ol interacti
  • “致命错误:无法找到本地 grunt。”在 Windows 7 上

    我根本无法让 grunt 在 Windows 7 上工作 按照 Grunt 网站上的说明进行操作 http gruntjs com getting started http gruntjs com getting started 我已经跑了
  • 如何合并多个 PDB 文件?

    我们目前正在使用单个命令行工具在 Windows 和 Linux 上构建我们的产品 到目前为止 它工作得很好 允许我们从源代码构建 并且具有比我们之前的任何构建系统所允许的更精细的依赖关系 这为我们带来了强大的增量和并行构建能力 为了简要描
  • 如何在Excel应用程序中使用javascript打开Excel html文件

    如何使用javascript或jQuery从浏览器中打开excel中的html文件 我一直在尝试仅使用 window open href 打开 html excel 文件 它在服务器上的位置是 server excelfiles myexc
  • 理解列表推导式的语法

    我不明白列表理解的语法 newList expression element for element in oldList if condition 我不明白的是 element 假设您有以下代码 List character for ch
  • Monotouch:UITableViewCell 高度

    我一直在网上冲浪以弄清楚如何使我的表格单元格高度适合其内容 我的内容具有不同的高度 我试着看看这个样本 http simon nureality ca simon says project d uitableviewcells autosi
  • 如何制作响应式表格[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有一个表来表示 html 页面中的一些数据 我正在尝试使该表具有响应能力 我怎样才能做到这一点 这里是Demo http jsfid
  • 如何在Android中的DatePicker中仅阻止过去的日期

    如何在Android中的DatePicker中仅阻止过去的日期 我正在使用过去日期和当前日期被阻止的示例代码 我只需要阻止过去的日期 而不是当前日期 这是我的代码 private DatePickerDialog OnDateSetList
  • 向 React Native WebView 添加 CSS 样式

    所以我对此有点困惑 我在应用程序的一部分中使用了 WebView 使用 WebView 的原因是因为我们从返回给我们 HTML 字符串的 API 端点拉取 此 HTML 字符串中的字体大小和其他内容的样式不是为了在移动应用程序中使用而设计的
  • 即使使用 TLSHandshakeTimeShift 选项,TLS 过期的 Hyperledger Fabric orderer 也无法启动

    我的 Hyperledger Fabric 网络的 TLS MSP 密钥已在 500 多小时前过期 由于过期 我的订单在停止后无法重新启动 我的订购者设置是 超级账本 Fabric 版本 2 2 RAFT共识 根据文档 我设置了TLSHan
  • WebElement.equals() 方法如何检查相等性?

    我有超过 1 个 XPath 指向一个 Web 元素 并且我想确定这两个元素是否等效 即 如果我在两个 Web 元素上执行操作 sendKeys 或 click 则该操作将在同一个 Web 元素上执行 目前我正在使用以下方法检查相等性 We
  • 重定向到带有 auth 标头的 url

    我正在尝试重定向到受保护的资源 当我按下登录按钮时 它会发送到我未受保护的登录 api 并返回一个令牌 其他路由期望标头 授权 不记名令牌 类型的交易 但我不知道当我重定向到受保护资源时如何设置标头 console log success
  • TFS 2018 以编程方式创建代理池

    是否可以以编程方式 最好通过 PowerShell 在 TFS 2018 中创建代理池 我在 REST API 中找不到类似的东西 我不知道为什么它没有详细记录 但这对我来说对 VSTS 有效 token myPAT base64AuthI
  • 获取 UITextView 中滚动后可见文本的 NSRange

    我正在尝试将滚动文本的位置保存在UITextView这样我就可以在加载时返回到该位置ViewController再次 我有很长的字符串 所以我希望用户能够滚动到特定位置 然后稍后返回到该位置 我正在使用UITextView scrollRa