UITextView - 使用 NSBackgroundColor 突出显示文本 - 排除换行符

2024-03-19

我有一个带有文本突出显示的工作功能,问题是它还突出显示换行符。看图片:

下面是我用来突出显示的函数:

   -(void)setHighlight{

        //set highlighted

        __block BOOL textIsHighlited = YES;

        [self.attributedText enumerateAttributesInRange:[self selectedRange] options:NSAttributedStringEnumerationLongestEffectiveRangeNotRequired usingBlock:^(NSDictionary *attrs, NSRange range, BOOL *stop) {
            if ([attrs valueForKey:@"NSBackgroundColor"] == Nil) {
                textIsHighlited = NO;
            }
        }];

        if (textIsHighlited) {
            [self.textStorage removeAttribute:NSBackgroundColorAttributeName range:[self selectedRange]];
        }else{
            [self.textStorage addAttribute:NSBackgroundColorAttributeName value:[UIColor greenColor] range:[self selectedRange]];
        }
    }

有什么简单的解决办法吗?我应该在换行符之前分割字符串并分别突出显示它们吗?另请注意,用户可以编辑字符串,因此必须有一些逻辑来检查文本在编辑其其他部分时是否没有中断。

感谢您的任何建议。


我的解决方案并不简单,我不知道它是否解决了你所有的问题,但我设法达到了你想要的效果。

我已经测试过了UILabel,在不同的字体和字体大小上,效果很好。

这是我所做的:

- (NSArray*)getRangesOfLinesForText:(NSString*)text font:(UIFont*)font containerWidth:(float)width {

    NSMutableArray *ranges = [[NSMutableArray alloc] init];

    NSInteger lastWhiteSpaceIndex = 0;
    NSInteger rangeStart = 0;
    NSMutableString *substring = [[NSMutableString alloc] init];
    for (int i = 0; i < [text length]; i++) {

        char c = [text characterAtIndex:i];
        [substring appendFormat:@"%c",c];

        CGRect substringRect = [substring boundingRectWithSize:CGSizeMake(width, font.capHeight)options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName : font} context:nil];

        if([[NSCharacterSet whitespaceAndNewlineCharacterSet] characterIsMember:c]) {
            lastWhiteSpaceIndex = i;
        }

        if(substringRect.size.width == 0) {
            NSRange range;
            if (lastWhiteSpaceIndex != i) {

                range = NSMakeRange(rangeStart, lastWhiteSpaceIndex-rangeStart);

                [ranges addObject:NSStringFromRange(range)];
                substring = [[NSMutableString alloc] init];
                i = lastWhiteSpaceIndex;
                rangeStart = lastWhiteSpaceIndex+1;
            }
        }
    }

    //Last Line
    NSRange range = NSMakeRange(rangeStart, [text length]-rangeStart);
    [ranges addObject:NSStringFromRange(range)];

    return ranges;
}

上面的方法分割了text字符串分成单独的行。不幸的是方法boundingRectWithSize:options:attributes:context:不支持自动换行,所以我必须自己检测。我通过检查是否实现了这一点substringRect.size.width == 0。 (当子字符串变得太长而无法适应线宽时,它会变为零)。

该方法返回每行的范围数组。 (范围转换为NSStrings with NSStringFromRange).

使用示例:

- (void)viewDidLoad
{
    [super viewDidLoad];

    UILabel *textLabel = [[UILabel alloc] initWithFrame:CGRectFromString(@"{{0,0},{300,400}}")];
    textLabel.numberOfLines = 0;
    [self.view addSubview:textLabel];


    NSString *text = @"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec luctus quis sapien a rutrum. Vivamus nec leo suscipit nibh rutrum dignissim at vel justo. Maecenas mi orci, ultrices non luctus nec, aliquet et nunc.";
    NSMutableAttributedString *string = [[NSMutableAttributedString alloc] initWithString:text];

    for (NSString* stringRange in [self getRangesOfLinesForText:text font:textLabel.font containerWidth:textLabel.frame.size.width]) {

        [string addAttribute:NSBackgroundColorAttributeName value:[UIColor greenColor] range:NSRangeFromString(stringRange)];

    }

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

UITextView - 使用 NSBackgroundColor 突出显示文本 - 排除换行符 的相关文章

  • 在 iOS 上使用 HEVC 编码器输出视频尺寸巨大

    我有一个项目 目前使用 H 264 编码器在 iOS 上录制视频 我想尝试在 iOS 11 中使用新的 HEVC 编码器来减小文件大小 但发现使用 HEVC 编码器会导致文件大小急剧膨胀 GitHub 上的一个项目显示了该问题 它使用 H
  • skView.ignoreSiblingOrder 在 swift 中的重要性/效率?

    这样做有多重要 高效skView ignoreSiblingOrder true初始化场景时 现在 我将其设置为 true 但由于某种原因 当我从 MainMenu 场景启动 GameScene 时 它 会在我的角色之前加载背景 即使背景的
  • 如何在 NSDate 变量中仅设置时间?

    我有 NSDate 变量 只想更改时间 不应更改日期 是否可以 例如 用户在 DatePicker 日期中选择日期间隔 如果是开始日期 我想将时间设置为 00 00 00 如果是结束日期 我将时间设置为 23 59 59 感谢你的帮助 问候
  • 在 Swift 中使用 commitEditingStyle 动态删除 UITable 部分

    我正在处理一个无法解决的问题 我有一个来自客户数据库数组的名称表 每个客户在其他数据成员中都有一个名称属性 我可以成功删除某个部分中的行 但我不能删除该部分 当该部分中的最后一行被删除时 该部分必须消失 I got NSInternalIn
  • 如何将字符串从 Applescript 传递到 Objective C

    我正在开发一个应用程序 我需要能够传递一个字符串变量 from 苹果脚本 to 目标C 我已经弄清楚如何从 Objective C 类中的方法运行 Applescript 但我需要能够将 NSString 设置为 Applescript 中
  • 如何在 SQLite 中替换字符串?

    如何更新具有以下内容的表列 var mobile 233KKFSDK3234 Documents Page jpg 并将其替换为 Documents Page jpg 在 SQLite 中 注意 所有文字 除了 Documents 是动态的
  • 以编程方式向 UIButton 标签添加阴影

    我试图向按钮标签添加 1px 黑色阴影 但没有成功 我试过这个 self setTitleShadowOffset CGSizeMake 0 1 但我得到 请求非结构或联合中的成员 setTitleShadowOffset 任何建议都会很棒
  • 为什么没有收到(UDP 多播)数据包?

    所以 我一直试图弄清楚为什么这不起作用 但我没有任何线索 我已经成功地从 iPhone 发送数据包并在 Mac 上接收它们 根据 tcpdump 我的 mac 正确发送数据包 此外 如果我在模拟器中运行它 它工作得很好 这让我相信这是一个网
  • malloc:***错误:已释放对象的校验和不正确 - 对象可能在释放后被修改

    我的 iOS 应用程序有一个大问题 它有时会崩溃 而没有详细的调试错误 堆栈跟踪为空 这是堆栈跟踪中仅有的两行 UIApplicationMain 中的 符号存根 UIHostedTextServiceSession DismissText
  • Swift:无法为“[UIViewController]”类型的值添加下标?

    我试图弄清楚如何在 Xcode 7 iOS9 上的 Swift 中解决此问题 并且我也遇到此错误 无法为 UIViewController 类型的值添加下标 索引类型为 Int 任何建议表示赞赏 谢谢 My code func indexP
  • iOS 11 浮动 TableView 标题

    有一个应用程序包含多个部分 展开 时每个部分有几行 折叠 时没有 每个部分都有一个部分标题 使用以下子类重用它们UITableViewHeaderFooterView等等 到目前为止一切顺利 然后在 iOS 11 中 我使用了可视化调试器
  • ios Vision VNImageRequestHandler方向问题

    我正在尝试使用相机通过相机检测脸部VNImageRequestHandler iOS 愿景 当我在横向模式下用相机指向照片时 它会检测到面部 但方向模式相反 let detectFaceRequestHandler VNImageReque
  • iOS 设置 MKMapView 中心,因此提供的位置位于底部中心

    我有一个 MKMapView 和一个永不改变的 CLLocationCooperative2D 我想做的是将地图居中 以便该坐标将放置在地图的底部中心 我可以用简单的方法将地图集中在这个坐标上 MKCoordinateRegion view
  • ios 11 - UIBarButtonItem 内的 UIButton 导致自动布局错误

    我在将 UIButton 添加到 UIBarButtonItem 时遇到了一个已知问题 我尝试按照建议添加自动布局约束堆栈溢出 https stackoverflow com a 46336639 505603但我收到如下所述的错误 UIB
  • 如何获取 UITableView 中的所有单元格

    假设我有一个包含多行的 UITableView 我想在某个时间点将所有 UITableViewCells 作为 NSArray 获取 我努力了 tableView visibleCells 但这种方法有一个问题 我无法拥有当前不在当前屏幕中
  • 我如何从 iPhone 设备获取电子邮件历史记录..?

    friends 我想从我的 iPhone 访问电子邮件历史记录 并且还希望在收到新邮件时收到通知 如果可能的话 请向我提供源代码片段 Thanks 简而言之 使用任何已记录的 API 都是不可能的
  • UITextView:内存使用量巨大

    我在 UITextView 中遇到了内存使用过多的问题 我正在将 50Kb ascii 文本文件加载到 NSString 中 并将其分配给应用程序中空 UITextView 组件的 text 属性 这立即使我的内存占用量增加了 100Mb
  • 断点条件错误

    我已经根据条件设置了断点 event name isEqualToString Some Name 这很好用 但是 当我尝试添加另一个带有条件的断点时 part name isEqualToString Some Value With A
  • let/var 如何解决可变性? [复制]

    这个问题在这里已经有答案了 我没有任何问题 我只是想对有关可变性的问题进行一些澄清 在 Objective C 中我们会使用例如NSMutableArray得到一个可变数组和NSArray得到一个不可变的 我对两者的内部运作了解不多 但据我
  • 进入后台时 Alamofire 请求卡住?

    我正在使用 Alamofire 调用 Web 服务 该服务需要相当长的时间才能加载 如果应用程序进入后台 当我返回应用程序时 我会被加载程序卡住 我想这是因为调用永远不会向我的完成处理程序返回任何内容 我该如何解决这个问题 您可以使用后台抓

随机推荐

  • “对于聚合函数无效的范围参数”是什么意思?

    表达方式 FormatNumber Avg CInt Code FirstSplit Fields AvgLOSC4 Value 0 0 当我尝试在 SSRS 管理器中更新报告时 会出现以下错误消息 文本框 textbox16 的值表达式具
  • 当在 tmux 会话中打开的 vim 进程上移动光标时,为什么它时不时地会留下幽灵字符的痕迹 - ^[OB,^[OA?

    如果我向上翻页和向下翻页 这些就会消失 为什么会发生这种情况以及如何纠正 https i stack imgur com DnMYl png https i stack imgur com DnMYl png 我最近摆弄了我的 vimrc
  • 如何使用 CodeDOM 在 AppDomain 中创建和加载程序集?

    我正在开发一个项目 该项目将使用 CodeDOM 创建一个类 该类计算用户定义的表达式 为该类创建程序集并加载该程序集 由于可能有相当数量的用户定义表达式 我想首先创建一个 AppDomain 执行 CodeDOM 创建 加载并执行该 Ap
  • 如何在 OpenLayers 4 上添加点击事件?

    我需要将事件侦听器附加到 OpenLayers 4 中的功能 我已经尝试过feature on 点击 function 但它不起作用 如何将晒黑事件添加到功能中 先感谢您 没有click为功能注册的事件ol Feature目的 但click
  • 包含第一个元素的反转数组切片[重复]

    这个问题在这里已经有答案了 假设我有 gt gt gt a 1 2 3 4 我想要一个反转的切片 假设我想要给出第 1 个和第 0 个元素start idx 1 and stop idx 0 2 1 使用切片符号 a x y z 我用什么值
  • 音乐播放列表数据库设计

    如何构建歌曲和播放列表的表格 我的想法是创建一个播放列表标题和 id 的表 然后创建一个播放列表歌曲表 其中保存歌曲的唯一 id 及其所属的播放列表 另一个为每个播放列表规划一个新表 并将播放列表的歌曲信息存储在每个表中 这是一个好方法还是
  • GenyMotion 无法启动 Genymotion 虚拟设备

    当我运行 Genymotion 时 出现以下错误 无法启动 Genymotion 虚拟设备 无法为虚拟设备配置网络适配器 请检查以下几点 在 VirtualBox 中 在软件的主要参数中 检查是否存在 Host only 网络适配器 在 V
  • C 字符值算术

    我一直在阅读 C 编程语言 一书来学习 C 我偶然发现了算术s i 0 他们说它给出了存储在 s i 中的字符的数值 我不太明白 它怎么能通过减法给出值呢 注意 这用在 atoi 函数中 该函数将数字字符串转换为其等价的数字 谢谢 可能重复
  • 如何通过命令行关闭Android模拟器

    我无法从命令提示符正常停止模拟器 我使用的是 Linux Ubuntu v10 04 64 位 和 Android v2 3 API 9 Gingerbread 我使用其快照启动了模拟器 现在我关心的是优雅地关闭正在运行的模拟器实例 我尝试
  • 手机应用程序设计指南[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否有包含创建移动电话应用程序的设计指南的文档或文章 如何构建应用程序以获得理想的用户体验 用户界面和键
  • 通过API重置登录cookie

    我想知道是否有任何方法可以通过API重置登录cookie 我知道如何通过管理中的设置来做到这一点 切换changePasswordAtNextLoginG Suite 用户的标记将其从所有设备中注销 使changePasswordAtNex
  • 如何使用 JsTestDriver 测试 jquery 和 ajax 调用?

    我有一个用 jQuery 构建的动态页面 Html 片段加载自mustache http mustache github com 模板 这些模板是从 URL 下载的 我想对整个 html 结构进行单元测试 JsTestDriver 测试是
  • 并发数据库访问给出 IllegalStateException

    我正在尝试为 1 个方法生成一个线程 我得到一个IllegalStateException 见下文 该方法的作用是接受与数据库的连接和数据库名称 并从中生成 XML 这部分有效 我只是想用一个新线程让它运行得更快 因为我有多个 XML 文件
  • Foreach 循环中的多个变量 [PowerShell]

    是否可以将两个变量放入 Foreach 循环中 以下是针对 PowerShell ASP 的编码 我的 Foreach 循环中的语法不正确 但您应该能够破译我试图构建的逻辑 list Get QADUser userid includeAl
  • XCTest:运行测试失败,且 Cycle inside X;在使用 CocoaPods 和 Carthage 的项目中,构建可能会产生不可靠的结果

    将我的项目升级到 Xcode 12 后 测试套件停止工作 测试目标无法编译 失败并显示 Cycle inside
  • Angular URL“trustAsResourceUrl”不起作用

    我在用着角度文件上传 js https github com nervgh angular file upload并上传图像 上传成功后 它会返回图像托管位置的 URL 该图像在 Azure 上作为 blob 托管 上传成功 并且正确返回
  • 如何搜索不在任何html标签中的url,然后将其转换为超链接?

    所以我的问题是 在相同的内容中有 iframe 图像标签等 它们都有正则表达式匹配 可以将它们转换为正确的格式 最后剩下的就是普通的 URL 我需要一个正则表达式 它将找到所有只是链接而不是在 iframe img 或任何其他标签内的链接
  • 在 Swing 应用程序中仅使用 JavaFX 触摸事件

    有没有办法在 swing 应用程序中使用 JavaFX 触摸事件 目前我正在使用 JFXPanel 来捕获 JavaFX 事件 但是当我尝试获取事件时 我没有收到任何触摸事件 而只收到鼠标事件 这是在 Windows 8 1 戴尔触摸屏上进
  • 如何在 C# 中确定进程的所有者?

    我正在寻找名为 MyApp exe 的进程 并且我想确保获得特定用户拥有的进程 我使用以下代码来获取进程列表 Process processes Process GetProcessesByName MyApp 这给了我一个进程列表 但是
  • UITextView - 使用 NSBackgroundColor 突出显示文本 - 排除换行符

    我有一个带有文本突出显示的工作功能 问题是它还突出显示换行符 看图片 下面是我用来突出显示的函数 void setHighlight set highlighted block BOOL textIsHighlited YES self a