Рисовать текст с выравниванием по центру в Cocoa View

#cocoa #macos #nsview

#cocoa #macos #nsview

Вопрос:

Я пытаюсь нарисовать строку с новыми строками ( n) в cocoa NSView с выравниванием по центру. Например, если моя строка равна:

 NSString * str = @"this is a long line n and n this is also a long line"; 
  

Я бы хотел, чтобы это выглядело примерно так:

   this is a long line
         and
this is also a long line
  

Вот мой код внутри метода NSView drawRect:

 NSMutableParagraphStyle * paragraphStyle = [[NSParagraphStyle defaultParagraphStyle] mutableCopy];

[paragraphStyle setAlignment:NSCenterTextAlignment];

NSDictionary * attributes = [NSDictionary dictionaryWithObject:paragraphStyle forKey:NSParagraphStyleAttributeName];

NSString * mystr = @"this is a long line n and n this is also a long line";

[mystr drawAtPoint:NSMakePoint(20, 20) withAttributes:attributes];
  

Он по-прежнему рисует текст с выравниванием по левому краю. Что не так с этим кодом?

Ответ №1:

В документации для -[NSString drawAtPoint:withAttributes:] указано следующее:

Ширина (высота для вертикальной компоновки) области рендеринга не ограничена, в отличие от drawInRect:withAttributes: , в котором используется ограничивающий прямоугольник. В результате этот метод отображает текст в одну строку.

Поскольку ширина не ограничена, этот метод отменяет выравнивание абзаца и всегда отображает строку выровненной по левому краю.

Вместо этого следует использовать -[NSString drawInRect:withAttributes:] . Поскольку он принимает рамку, а рамка имеет ширину, он может вычислять выравнивания по центру. Например:

 NSMutableParagraphStyle * paragraphStyle =
    [[[NSParagraphStyle defaultParagraphStyle] mutableCopy] autorelease];
[paragraphStyle setAlignment:NSCenterTextAlignment];
NSDictionary * attributes = [NSDictionary dictionaryWithObject:paragraphStyle
    forKey:NSParagraphStyleAttributeName];

NSString * mystr = @"this is a long line n and n this is also a long line";    
NSRect strFrame = { { 20, 20 }, { 200, 200 } };

[mystr drawInRect:strFrame withAttributes:attributes];
  

Обратите внимание, что вы допускаете утечку paragraphStyle в исходном коде.

Комментарии:

1. Будет ли у меня все еще утечка ParagraphStyle, если я использую сборку мусора?

2. @Amal Если вы используете сборку мусора, утечки нет.