首页 文章

如何旋转NSTextView

提问于
浏览
1

我希望像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 回答

  • 1

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

    [myView setFrameRotation:angleInDegrees];
    

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

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

  • 0

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

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

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

相关问题