如何旋转NSTextView

时间:2011-06-14 11:43:03

标签: objective-c cocoa drawing nstextview

我希望像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,它不会显示任何文本(只有一个光标)并且不会旋转。是否还有其他东西可以使它起作用?

3 个答案:

答案 0 :(得分:1)

你太复杂了。只需在视图上设置旋转:

[myView setFrameRotation:angleInDegrees];

还有setFrameCenterRotation,但这应该仅适用于图层支持的视图(可以)。

我还在调查自己的一个警告:当旋转视图时,闪烁的文本光标变得非常胖。

答案 1 :(得分:0)

为什么不让视图层支持?然后,您可以将仿射变换应用于视图的图层。

yourView.layer.transform = CATransform3DMakeRotation(M_PI_4, 0, 0, 1.0);

答案 2 :(得分:0)

问题是您正在创建NSAffineTransform,但您没有将其附加到文字视图中。