编程实现NSTextView中选择的文字切换粗体

NSTextView和Attribued String 1.NSTextView和Attribued String第一次接触苹果系的富文本编程是在写Mac平台上的一个输入框的时候,输入框中的文字可以设置各种样式,并可以在文字中间插入图片,好在Mac的AppKit中提供了NSTextView这个支持富文本编辑器控件。此控件背后是通过什么方式来描述富文本的呢?答案是NSAttributedString,很多编程语言都提供了AttributedString的概 阅读详情

这里和文字相关的,一般涉及到NSTextStorage(文本编辑)、NSFont(字体)和NSFontDescriptor(字体信息描述)、NSFontManager(字体管理器)

首先要textView(统一用它代表NSTextView的实例)得到选中的范围:

NSArray *aArray = textView.selectedRanges;
if(!aArray || aArray.count==0)
{
    return;
}
NSRange selectedRange = [(NSValue *)[aArray objectAtIndex:0] rangeValue];  //常见的选中范围是一个,想要通用,可以for一把

想要修改文字属性,需要通知textStorage:

    NSTextStorage *textStorage = [textView textStorage];
    [textStorage beginEditing];   //开始编辑

    //这里是编辑过程。。。。

    [textStorage endEditing];    //结束编辑

最后需要通知textView文本已经更新了:

[textView didChangeText];

整个流程已经实现,打完收工?

不不不,上面是总括流程,还有中间细节需要处理(编辑过程)

这里需要用到NSTextStorage的操作

- (void)enumerateAttributesInRange:(NSRange)enumerationRange options:(NSAttributedStringEnumerationOptions)opts usingBlock:(void (NS_NOESCAPE ^)(NSDictionary<NSAttributedStringKey, id> *attrs, NSRange range, BOOL *stop))block API_AVAILABLE(macos(10.6), ios(4.0), watchos(2.0), tvos(9.0));

这个操作主要是枚举选中范围内的所有字体属性,例如我们选中“123ABC“,其中123已经是粗体,但是ABC不是,这里就可能枚举出2个范围,也可能更多,比如123是Arial,AB可能是宋体,C可能其他字体。所有必须枚举完这些,注意修改属性。

如上述,选中的文字包含粗体和非粗体的,在著名的编辑软件都是先同意修改成粗体或非粗体,我选择是对第一个枚举的范围属性做标识,然后后面的都根据第一个标识统一修改。

这里需要用到穿越block的参数标识”__block“。

在块里面,可以得到通过NSDictionary *attributesDictionary传递的字体信息

NSFont *font = [attributesDictionary objectForKey:NSFontAttributeName];

然后对font分析是否已经设置为粗体:

             NSFontDescriptor *desc=font.fontDescriptor;
             NSFontDescriptorSymbolicTraits symbolic_traits=desc.symbolicTraits;
             if (!hasChange)
             {
                 hasChange=YES;
                 //NSFontDescriptorTraitBold == NSBoldFontMask
                 if ((symbolic_traits & NSFontDescriptorTraitBold)==0) {
                     //if not bold then set to bold
                     bold_flag=1;
                 }
             }

通过将font放置到通用的NSFontManager,然后进行修改,重新读出来:

             NSUInteger traits = (NSUInteger)symbolic_traits;
             NSFontManager *fontManager = [NSFontManager sharedFontManager];
             [fontManager setSelectedFont:font isMultiple:NO];
             //weight(0~9);default=5
             font = [fontManager fontWithFamily:font.familyName traits:(traits) weight:5 size:(font.pointSize)];

对选中字体切换字体的过程就这么多。中间还有一个很小很小的细节留给读者补充^_^

深入掌握iOS TextKit框架:NSTextStorage等核心类实战解析 highlightPattern(#"#[^\s#]+"#, color: .systemBlue) // #标题highlightPattern(#"\*\*[^*]+\*\*"#, color: .red) // **粗体**highlightPattern(#"\*[^*]+\*"#, color: .italicColor) // *斜体*TextKit 并不是一个过时的技术。相反,它是 iOS 上实现出版级文本渲染的唯一途径。 阅读详情

相关推荐

TextStory:更快乐,更灵活的NSTextStorage

文字故事 TextStory是一小组类和协议,可简化与NSTextStorage及其关联系统的工作。 支持iOS和macOS。 一体化 Swift软件包管理器: dependencies : [ . package ( url : " https://github.com/ChimeHQ/TextStory " ) ] 迦太基: github "ChimeHQ/TextStory" TSYTextStorage 一个最小的NSTextStorage子类,可为更强大的委托行为提供挂钩。 非常适合从存储对象中分离逻辑/行为。 因为它是为包装另一个NSTextStorage实例而构建的,所以它更容易组合。 不幸的是,到目前为止,我还没有找到在Swift中构建此类的方法。 如果您有使用NSTextStorage和Swift / ObjC自动NSString / String桥接的

1.3 python入门之文件和异常

文章目录文件操作逐行读取写入文件 文件操作 with open('digit.txt') as file_obj #在当前PY文件所在目录下寻找TXT文件,open方法返回文件对象,并存储在file_obj中 contents = file_obj.read() print(contents) 打开文件——>访问文件 with方法会自动管理文件的关闭 read方法会在到达文本文件末尾时返回一个空字符串,所以再print时会比原文件多个空行 所以改为print(content

剑雨巍巍的博客 314

NSTextStorge等类的初步使用

TextKit学习(三)NSTextStorage,NSLayoutManager,NSTextContainer和UITextView对应的Demo。

NSTextStorage (SwiftUI 中文文档手册)

NSTextStorage TextKit的基本存储机制。 class NSTextStorage : NSMutableAttributedString 总览 NSTextStorage是NSMutableAttributedString的子类,它增加了管理一组客户端对象的行为。文本存储对象将其字符或属性的更改通知其布局管理器,这使布局管理器可以根据需要重新显示文本。NSMutableAttributedStringNSLayoutManager 可以从应用程序的任何线程访问文本存储对象,但是您的应用程

iCloudEnd的博客 716

使用 Cadence ams 仿真器 对 混合信号电路 进行仿真

文章目录Cadence 基于ams仿真器的混合信号电路仿真建立数字(Digital)模块建立 Analog - Digital 混合仿真原理图建立 Analog - Digital 混合仿真config文件配置混合信号电路仿真环境针对混合信号电路demo进行仿真 Cadence 基于ams仿真器的混合信号电路仿真 你好,这里是一篇关于使用 Cadence 软件通过 ams 仿真器对混合信号电路(D...

mymatin1004的博客 2万+

SAE J1939协议详解

SAE J1939协议是由美国汽车工程师协会(SAE)制定的主要针对商用车的CAN总线通讯协议,其基础是CAN2.0B协议,面向对象为客车和载重货车;船舶、农业机械等非路面设备。1.SAE J1939协议文档结构如下图:2.CAN的发展概况20世纪80年代,Bosch的工程人员开始研究用于汽车的串行总线系统,1986年, Bosch在SAE(汽车工程师协会)大会上提出了 CAN,1987年,INTEL就推出了第一片CAN控制芯片—82526;随后Philips半导体推出了82C200。

weixin_46184756的博客 8446

NSAttributedString的用法

@interface NSAttributedString : NSObject NSCopying, NSMutableCopying, NSCoding> - (NSString *)string; - (NSDictionary *)attributesAtIndex:(NSUInteger)location effectiveRange:(NSRangePointer)

树上的男爵 1万+

facebook协议

支持同时登录多个Facebook账号,按照关键词采集小组地址,群发小组,批量添加推荐人,群发推 荐人消息,采集个人Facebook用户,群发用户私信,群发主页评论。通过客服台管理功能,和粉丝互动聊天,通过话术快捷回复,自动翻译聊天记录。通过FaceBook小组采集小组成员id,或者通过FaceBook个人主页,采集主页上粉丝批量操作已FaceBook账号添加推荐热,可以指定添加某个国家的推荐人,可以设置每个账号添加推荐人个数去重模式:所有的FaceBook账号不添加重复的推荐人。

2503_90751938的博客 959

获取NSAttributedString属性的方法

在封装一个alertView的时候,需要设置颜色和行距,字距,所有要用到富文本,在封装alertView的时候,留下一个开放的接口/** * 带有属性的内容 */ @property (nonatomic,copy)NSMutableAttributedString *attributeMassage;设置内容alertView的attributeMassage会自动计算高度和尺寸,所有会用到

qq_28839127的博客 3850

写出GD32L233/235在读写flash的区别(用于OTA功能)

在单片机里面表示 大概是 address += sizeof(uint32_t) address += sizeof(uint64_t)1.说到OTA功能,实际上 往flash 指定区域写 数据, 拷贝数据,然后 跳转, 必要时 注意单片机的偏移量。在写本文时,L233支持单字写入,而L235只有双字写入. 一个写入地址+4 一个写入地址+8。这个是 自己写的擦除一页 数据,当然可以参考 提供的demo去实现,看自己需求。接下来是 读取 双字,也就是在L235上的读取。

teleger的博客 908

2026.3.10:最新claude code完美解决方案,跳过登录界面,使用国内deepseek-v4-pro进行计费

本文介绍了一种绕过Claude登录界面直接使用国内DeepSeek-V4-Pro服务的解决方案。通过npm全局安装@anthropic-ai/claude-code包,并配置5个关键环境变量:API认证令牌、基础URL(指向DeepSeek服务)、指定模型为deepseek-v4-pro、禁用非必要流量等。文中提供了4张配图辅助说明配置过程,但未展示具体内容。该方案可实现直接计费使用,无需通过官方登录流程。

拥抱具身智能,昇腾Ascend C 6515

TextKit学习(三)NSTextStorage,NSLayoutManager,NSTextContainer和UITextView

先上一张图: 这是使用UITextView时用到的iOS7新增加的类:NSTextContainer、NSLayoutManager、NSTextStorage及其相互关系: 这三个新出的类还没有在官方出独立的class reference,但是在新出的UIKit_Framework上已经有这些类的相关说明及使用方法,当然官方还会更新。 以下是

精灵的专栏 1万+

手把手教你学基带SOC芯片(4.4.9)--基带芯片的电源管理实例:高通 Snapdragon 系列实例(十)

Snapdragon 888 通过支持多种深度睡眠模式,如 AOAC 模式、低功耗模式和深度睡眠模式,以及智能电源管理技术,实现了对功耗的精细管理。这些模式不仅延长了设备的电池寿命,还确保了用户在各种使用场景下的良好体验。无论是保持网络连接、限制后台活动,还是完全关闭不必要的功能,Snapdragon 888 都能够灵活应对,提供高效的功耗管理方案。

MHD0815的博客 740

【已解决】Mac OS X如何设置Label(NSTextField)自适应居中?

问题 在Mac OS X开发过程中,经常会使用Label(NSTextFiled)控件,对于文本长度不定的Label,我们如何设置其自动居中? 解决方案 Label居中时X、Y坐标的计算如下图所示 假设有一个label处于superView中,当我们修改label内容后,我们可以通过以下方式调整位置,使其居中。 IBOutlet NSView *superView; __weak IBOutle...

Mac开发修炼之路 3953

Python DEAP 库深度解析:从基础架构到高级应用

DEAP 是一个基于 Python 的开源框架,专门用于实现和运行各种进化算法,旨在帮助用户轻松地构建和调整进化算法,用于解决各种优化和搜索问题。本节中,介绍了 DEAP 相较于其它进化计算框架的优势,以及 DEAP 中重要的工具 creator 和 Toolbox。

盼小辉丶的博客 5102

某易将军令口令纯算法还原py篇

算法开源,将军令口令算法。希望官方多多更新吧

任雪飘的博客 3909

【Mac OS X开发】NSTextFieldCell选中和正常状态的字体段落样式设置

在设置NSTextFieldCell在选中状态和未选中状态时的两种不同的字体段落样式时,查找网上的资料,发现有很多是复制attributedStringValue进行属性字典的构建,先前也觉得这样很便利,可以直接针对某属性样式进行修改,如下所示: - (void)drawWithFrame:(NSRect)cellFrame inView:(NSView*)controlView {

freeWayWalker的专栏 5226

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

ios设置字体-黑体,加粗等 修改textField的placeholder的字体颜色、大小

ios开发中,经常用到UILable,此时如何让UILable的字体变化为不同的颜色,样式,从而增加UI美感呢?下面我进行了总结和归纳,内容来自于网络,当时经过我自己的整理.希望对我自己和大家有所帮助。1.设置黑体,粗体,斜体等都需要用到下面的方法。label.font=[UIFont fontWithName:@"ArialMT"size:24]; //fontWithName处字体不知道名字,可

操作猛如虎的博客 3052

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Mac开发--NSTextField自定义行高及文字居中

在网上,Mac开发的资料比较少,我们在Mac开发中用的Cocoa框架(包含Foundation和AppKit框架)远没有Cocoa Touch框架(包含Foundation和UIKit框架,运用于ios开发)智能。所以有时候我们不得不自己动手去做一些适配。 比如,我最近在项目开发中要开发一个IM的功能,所以要写一个聊天的页面,要通过内容计算行高和宽度适配。在查询文档之后,总结了一下:(需要计算高度和宽度) 定义一个NSTextField: NSTextField* contentField =

hw的博客 1886

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

NSFont字体大全

原文地址:http://www.cocoachina.com/downloads/video/2010/0827/2061.html

a247047679的专栏 1209

NSTextField 处于编辑状态时,点击return键 结束编辑,NSButton的return快捷方法不响应

NSButton 设置快捷键 return, 当 NSTextField 处于编辑状态时, 点击return键 结束编辑,要求不响应button的return快捷方法 attributes inspector 面板中设置 NSTextField 的 Action 属性 为 Send On Enter Only. 代码设置:    [_textField.cell setSendsActio...

VictorZhang 1415

【Swift】 NSTextView用法和示例

NSTextView用法和示例

三岁牧羊的博客 1534

利用 NSAttributedString 进行富文本处理

原文出自 http://blog.qiji.tech/archives/8335#RegEx_Categories [iOS] 利用 NSAttributedString 进行富文本处理 /iOS/[iOS] 利用 NSAttributedString 进行富文本处理 2016年4月4日 刘小龙 iOS 许多时候我们需要以各种灵活的形式展现文本信息,...

weixin_30908707的博客 160

NSFont常用字体

1 NSFont *font = [NSFont systemFontOfSize:[NSFont smallSystemFontSize]]; 2 // NSFont *font = [NSFont fontWithName:@"Helvetica" size:8]; 3 // NSFont *font = [NSFont boldSystemFontOfSiz

Secret Island 4620
上一篇: addon@Node.js之新手上路
下一篇: 代码添加toolbar(Cocoa)
狼风123
博客等级 码龄19年 1058粉丝 42原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值