我希望像Adobe Illustrator一样拥有可旋转的文本编辑区域。我尝试了几件事,包括子类化NSTextView并在绘图代码之前添加坐标系旋转,如下所示:
@implementation MyNSTextView
-(void)drawRect:(NSRect)dirtyRect
{
NSAffineTransform * trafo = [NSAffineTransform transform];
[trafo rotateByDegrees:45];
[trafo concat];
[super drawRect:dirtyRect];
}
-(void)drawInsertionPointInRect:(NSRect)rect color:(NSColor *)color turnedOn:(BOOL)flag
{
NSAffineTransform * trafo = [NSAffineTransform transform];
[trafo rotateByDegrees:45];
[trafo concat];
[super drawInsertionPointInRect:rect color:color turnedOn:flag];
}
导致文本显示损坏。我还尝试通过子类化NSView并以编程方式组装文本架构来实现自己的功能。我使用我的NSLayoutManager的drawGlyphsForRange:方法绘制字符串。这部分工作但很复杂,因为我必须旋转绘图的坐标,并处理鼠标点击我必须将鼠标位置转换回旧坐标。
这是最好的方法,还是还有其他的东西?
编辑:我现在尝试使用CALayer:
@implementation MyNSTextView
-(id)initWithFrame:(NSRect)frameRect
{
self = [super initWithFrame:frameRect];
if (self) {
CALayer *myLayer = [CALayer layer];
myLayer.transform = CATransform3DMakeRotation(1.6,1,0,1.0);
[self setLayer:myLayer];
[self setWantsLayer:YES];
}
return self;
}
但是这会产生一个TextView,它不会显示任何文本(只有一个光标)并且不会旋转。是否还有其他东西可以使它起作用?
答案 0 :(得分:1)
你太复杂了。只需在视图上设置旋转:
[myView setFrameRotation:angleInDegrees];
还有setFrameCenterRotation
,但这应该仅适用于图层支持的视图(可以)。
我还在调查自己的一个警告:当旋转视图时,闪烁的文本光标变得非常胖。
答案 1 :(得分:0)
为什么不让视图层支持?然后,您可以将仿射变换应用于视图的图层。
yourView.layer.transform = CATransform3DMakeRotation(M_PI_4, 0, 0, 1.0);
答案 2 :(得分:0)
问题是您正在创建NSAffineTransform
,但您没有将其附加到文字视图中。