как нарисовать текст точно так же, как они есть в NSTextView - PullRequest
0 голосов
/ 27 июня 2019

Я использовал NSTextView для редактирования текста, установки цвета и размера шрифта, без установки NSParagraphStyle. Теперь я хочу спрятать NStextView и вынуть NSString или NSAttributedString из NSTextView и нарисовать его на NSView позади объекта NSTextView. Я хочу, чтобы отображаемый текст был точно таким же, как в NSTextView, включая шрифты, межсловный интервал, высоту строки, межстрочный интервал.

Какие методы должны быть использованы для этого?

Мой нынешний подход заключается в следующем, но эффект не очень хороший. Высота строки не соответствует таковой в NSTextView. Также есть проблема с другими деталями.

NSTextView* textView = [[NSTextView alloc]init];
        [[self contentView] addSubview:textView positioned:NSWindowAbove relativeTo:myView];
        [textView setAutoresizingMask:NSViewWidthSizable];
        [textView setMinSize:NSMakeSize(25, 25)];
        [textView setMaxSize:NSMakeSize(FLT_MAX, FLT_MAX)];
        [textView setDrawsBackground:NO];

    [[textView textContainer] setContainerSize:NSMakeSize(FLT_MAX, FLT_MAX)];
    [[textView textContainer] setWidthTracksTextView:NO];

    [textView setVerticallyResizable:YES];
    [textView setHorizontallyResizable:YES];
    [textView setTextColor:[NSColor redColor]]; 
    [textView setFrame: NSMakeRect(200, 200, 25, 25)];  //the textView will auto resize when typing
    [textView setFont:[NSFont fontWithName:@"Arial" size:16.0f];
    [textView setHidden:NO];

// после ввода я скрою textView и нарисую attributeString в функции drawInRect в myView.

    NSRect rct = textView.frame;
    [textView setHidden: YES];
    NSMutableAttributedString *textDraw = [[NSMutableAttributedString alloc] initWithAttributedString: textView.attributedString];
    //i get the defaultParagraphStyle to set to NSMutableAttributedString
    [textDraw setAttributes:textView.defaultParagraphStyle range:NSMakeRange(0, textDraw.length)];

    NSMutableDictionary *md = [NSMutableDictionary dictionary];
    [md setObject:[NSColor redColor] forKey:NSForegroundColorAttributeName];            
    [textDraw setAttributes:md range:NSMakeRange(0, textDraw.length)];

    [textDraw drawInRect:rct];

1 Ответ

0 голосов
/ 28 июня 2019

Я нашел ответ.
[string drawAtPoint: point] - использует NSTypesetterBehavior_10_2_WithCompatibility, но NSTextView по умолчанию использует NSTypesetterLatestBehavior.

Я использую приведенный ниже код для решения проблемы:

[[textView layoutManager] setTypesetterBehavior:NSTypesetterBehavior_10_2_WithCompatibility];

установите TypesetterBehavier так же, как функции рисования NSString, тогда проблема исчезнет.

исходная ссылка здесь:

https://zachwaugh.com/posts/nstextview-and-nsstring-differences-in-text-rendering

, поэтому последний кодэто:

    NSTextView* textView = [[NSTextView alloc]init];
    [[self contentView] addSubview:textView positioned:NSWindowAbove relativeTo:myView];
    [textView setAutoresizingMask:NSViewWidthSizable];
    [textView setMinSize:NSMakeSize(25, 25)];
    [textView setMaxSize:NSMakeSize(FLT_MAX, FLT_MAX)];
    [textView setDrawsBackground:NO];

    [[textView textContainer] setContainerSize:NSMakeSize(FLT_MAX, FLT_MAX)];
    [[textView textContainer] setWidthTracksTextView:NO];

    [textView setVerticallyResizable:YES];
    [textView setHorizontallyResizable:YES];
    [textView setTextColor:[NSColor redColor]]; 
    [textView setFrame: NSMakeRect(200, 200, 25, 25)];  //the textView will auto resize when typing
    [textView setFont:[NSFont fontWithName:@"Arial" size:16.0f];
    [textView setHidden:NO];
    [[textView layoutManager] setTypesetterBehavior:NSTypesetterBehavior_10_2_WithCompatibility];

и чертежный код:

    NSRect rct = textView.frame;
    [textView setHidden: YES];
    NSAttributedString textDraw = textView.attributedString;        
    [textDraw drawInRect:rct];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...