Как повернуть NSTextView - PullRequest
1 голос
/ 14 июня 2011

Я хочу иметь вращаемую область редактирования текста, как в 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 и программно собрав текстовую архитектуру. Я рисую строку с помощью drawGlyphsForRange: метод моего NSLayoutManager. Это отчасти работает, но усложняется, потому что мне нужно повернуть координаты для чертежа и для обработки щелчков мыши, мне нужно преобразовать местоположение мыши обратно в старые координаты.

Так это лучший способ сделать это или есть что-то еще?

Редактировать: теперь я пытался использовать 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 голос
/ 13 июня 2012

Вы делаете это слишком сложным.Просто установите вращение на самом виде:

[myView setFrameRotation:angleInDegrees];

Существует также setFrameCenterRotation, но это должно работать только для представлений со слоями (что нормально).

ТамЭто одна оговорка, которую я до сих пор исследую: мигающий текстовый курсор становится очень толстым, когда вид поворачивается.

0 голосов
/ 15 июня 2011

Проблема в том, что вы создаете NSAffineTransform, но не присоединяете его к текстовому представлению.

0 голосов
/ 15 июня 2011

Почему бы не сделать представления слоистыми? Затем вы можете просто применить аффинное преобразование к слою представления.

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