#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 Если вы используете сборку мусора, утечки нет.