场景
在开发Cocoa
程序时,表格NSTableView
是经常使用的控件。其基于View Base
的视图单元格模式就是使用NSCell
或其子类来控制每个单元格的呈现。当一个单元格里的文字过多时,需要截断超出宽度的文字,怎么实现?
说明
Cocoa
下的文本绘制和Win32
不同,Cocoa
下的字符串NSString
是类,具有绘制drawInRect
方法;Win32
则需要调用GDI
来绘制文本,文本本身只是一个宽子节字符串wchar_t
, 并不是一个封装的类。
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
如果需要增加额外的绘制属性,需要使用带withAttributes
参数的方法,类似文本段行是需要用到文本属性里添加一种key
为NSParagraphStyleAttributeName
,value
为NSMutableParagraphStyle
实例的值。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
参考
NSMutableParagraphStyle