当前位置: 首页 > news >正文

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

场景

  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

相关文章:

  • asm技术简介
  • 中国联通(海外)数据中心资源:从基础设施运维服务到IDC机房增值服务
  • 在 Qt 中构建和解析多层嵌套的 JSON 数据
  • 通信工程学习:什么是SISO单入单出
  • GEE问题: 离校后学校edu账户无法使用,如何导出我们所有的脚本
  • C#通用文档识别挂接示例、手写体识别接口
  • 昇思MindSpore进阶教程--报错分析
  • AJAX(简介以及一些用法)
  • (笔记)第三期书生·浦语大模型实战营(十一卷王场)--书生入门岛通关第1关Linux 基础知识
  • [RabbitMQ] 7种工作模式详细介绍
  • 一文上手SpringSecurity【七】
  • 怎么查看网站是否被谷歌收录,查看网站是否被搜索引擎收录5个方法与步骤
  • 傅里叶级数在机器人中的应用(动力学参数辨识)
  • Kotlin高阶函数func
  • 二值图像的面积求取的两种方法及MATLAB实现
  • 时间复杂度分析经典问题——最大子序列和
  • 002-读书笔记-JavaScript高级程序设计 在HTML中使用JavaScript
  •  D - 粉碎叛乱F - 其他起义
  • node和express搭建代理服务器(源码)
  • NSTimer学习笔记
  • Promise面试题,控制异步流程
  • Python 基础起步 (十) 什么叫函数?
  • Spring Boot快速入门(一):Hello Spring Boot
  • 程序员最讨厌的9句话,你可有补充?
  • 讲清楚之javascript作用域
  • 利用阿里云 OSS 搭建私有 Docker 仓库
  • 码农张的Bug人生 - 见面之礼
  • 数组大概知多少
  • 为物联网而生:高性能时间序列数据库HiTSDB商业化首发!
  • 我的zsh配置, 2019最新方案
  • 找一份好的前端工作,起点很重要
  • 最简单的无缝轮播
  • ​2021半年盘点,不想你错过的重磅新书
  • ​用户画像从0到100的构建思路
  • #162 (Div. 2)
  • (20050108)又读《平凡的世界》
  • (7) cmake 编译C++程序(二)
  • (cljs/run-at (JSVM. :browser) 搭建刚好可用的开发环境!)
  • (ZT)北大教授朱青生给学生的一封信:大学,更是一个科学的保证
  • (附源码)springboot建达集团公司平台 毕业设计 141538
  • (十) 初识 Docker file
  • (转)视频码率,帧率和分辨率的联系与区别
  • (自用)交互协议设计——protobuf序列化
  • .locked1、locked勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .net 7 上传文件踩坑
  • .NET CORE 第一节 创建基本的 asp.net core
  • .net core使用ef 6
  • .NET delegate 委托 、 Event 事件
  • .net redis定时_一场由fork引发的超时,让我们重新探讨了Redis的抖动问题
  • .Net 中Partitioner static与dynamic的性能对比
  • .NET/ASP.NETMVC 大型站点架构设计—迁移Model元数据设置项(自定义元数据提供程序)...
  • .Net插件开发开源框架
  • .NET分布式缓存Memcached从入门到实战
  • .net实现头像缩放截取功能 -----转载自accp教程网
  • .NET中使用Protobuffer 实现序列化和反序列化