[Cocoa]_[初级]_[绘制文本如何设置断行效果]

news/2024/10/4 4:09:26 标签: cocoa, macos, 断行, 绘制文本, 单元格, 表格

场景

  1. 在开发Cocoa程序时,表格NSTableView是经常使用的控件。其基于View Base的视图单元格模式就是使用NSCell或其子类来控制每个单元格的呈现。当一个单元格里的文字过多时,需要截断超出宽度的文字,怎么实现?

说明

  1. Cocoa下的文本绘制和Win32不同,Cocoa下的字符串NSString是类,具有绘制drawInRect方法;Win32则需要调用GDI绘制文本,文本本身只是一个宽子节字符串wchar_t, 并不是一个封装的类。

  2. NSString类的绘制方法其实是内部调用了活动图形上下文来绘制,只是对调用者隐藏了操作。并且如果要调用这些方法,必须是聚焦在视图的绘制函数或者一个活动的图形上下文里才可以。以下是drawInRect描述里的部分原文:

There must be either a focused view or an active graphics context when you call this method.
@interface NSString(NSStringDrawing)
- (NSSize)sizeWithAttributes:(nullable NSDictionary<NSAttributedStringKey, id> *)attrs NS_AVAILABLE(10_0, 7_0);
- (void)drawAtPoint:(NSPoint)point withAttributes:(nullable NSDictionary<NSAttributedStringKey, id> *)attrs NS_AVAILABLE(10_0, 7_0);
- (void)drawInRect:(NSRect)rect withAttributes:(nullable NSDictionary<NSAttributedStringKey, id> *)attrs NS_AVAILABLE(10_0, 7_0);
@end

@interface NSAttributedString(NSStringDrawing)
- (NSSize)size NS_AVAILABLE(10_0, 6_0);
- (void)drawAtPoint:(NSPoint)point NS_AVAILABLE(10_0, 6_0);
- (void)drawInRect:(NSRect)rect NS_AVAILABLE(10_0, 6_0);
@end
  1. 如果需要增加额外的绘制属性,需要使用带withAttributes参数的方法,类似文本段行是需要用到文本属性里添加一种keyNSParagraphStyleAttributeName,valueNSMutableParagraphStyle实例的值。NSMutableParagraphStyle[1]类可以控制比如对齐方式,断字方式等。这里用到就是断行属性lineBreakMode,根据字母断行
NSMutableParagraphStyle *paragraphStyle = [[[NSMutableParagraphStyle alloc] init] autorelease];
paragraphStyle.lineBreakMode = NSLineBreakByCharWrapping; // 根据字母进行换行
paragraphStyle.alignment = NSTextAlignmentLeft;

NSMutableDictionary* attri = [[NSMutableDictionary alloc] init];
[attri setValue:paragraphStyle forKey:NSParagraphStyleAttributeName];

[self.description drawInRect:rect withAttributes:attri];

图1

在这里插入图片描述

参考

  1. NSMutableParagraphStyle

http://www.niftyadmin.cn/n/5689383.html

相关文章

我尝试了LangGraph Studio的AI Agent功能

构建一个真正“智能”的Agent——一个能够理解语言、做出决策并进行有意义互动的Agent——并不像编写几行代码那么简单。 它需要对AI原理和软件工程有深刻的理解。 此外&#xff0c;传统的软件工具并不适合Agent的开发&#xff0c;无法满足其独特需求。 这也是像LangGraph S…

数据结构(栈和队列的实现)

1. 栈&#xff08;Stack&#xff09; 1.1 栈的概念与结构 栈是一种特殊的线性表&#xff0c;其只允许固定的一段插入和删除操作&#xff1b;进行数据插入和删除的一段叫做栈顶&#xff0c;另一端叫栈底&#xff1b;栈中的元素符合后进先出LIFO&#xff08;Last In First Out&…

JVM Class类文件结构

国庆节快乐 2024年10月2日17:49:22 目录 前言 magic 数 文件版本 使用JClassLib观察class文件 一般信息 接口 常量池 字段 方法 常量池计数器 常量池 类型 CONSTANT_Methodref_info CONSTANT_Class_info 类型结构总表 访问标志 类索引, …

【预备理论知识——1】深度学习:概率论概述

简单地说&#xff0c;机器学习就是做出预测。 概率论 掷骰子 假设我们掷骰子&#xff0c;想知道看到1的几率有多大&#xff0c;而不是看到另一个数字。 如果骰子是公平的&#xff0c;那么所有六个结果{1,…, 6}都有相同的可能发生&#xff0c; 因此我们可以说 1 发生的概率为1…

Redis: 主从复制读写分离环境搭建

概述 Redis 的单机模式实际上就是在一个服务器上装了一个单节点的Redis通过简单的配置和简单的命令启动起来就可以使用这种搭建环境&#xff0c;不保证高可用的情况下&#xff0c;完全没有问题如果说你的项目必须要具备高可用&#xff0c;而且 Redis 也要提供更高的性能这个单…

<数据集>工程机械识别数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;2644张 标注数量(xml文件个数)&#xff1a;2644 标注数量(txt文件个数)&#xff1a;2644 标注类别数&#xff1a;3 标注类别名称&#xff1a;[dump truck, wheel loader, excavators] 序号类别名称图片数框数1dum…

pdf处理1

处理PDF文件以构建数据索引是一个复杂但关键的步骤&#xff0c;尤其是因为PDF格式的文件通常包含多种元素&#xff0c;如文本、图片、表格、标题等。以下是一个通俗易懂的详细解释&#xff0c;帮助你理解PDF文件是如何被处理和解析的&#xff1a; 1. PDF文件的基本结构 PDF&a…

国外电商系统开发-运维系统开发

因项目运营环境在国外&#xff0c;所以必须将服务器选择国外&#xff0c;加上第一次运营国外项目。在两大趋势下&#xff0c;企业的运营方向必须通过大数据来分析及修正运营方向&#xff0c;加上后期服务器数量日益增多&#xff0c;如何有效的管理众多的服务器及验证运营方向&a…