Нарисуйте текст с выравниванием по центру в представлении какао - PullRequest
5 голосов
/ 02 мая 2011

Я пытаюсь нарисовать строку с новыми линиями (\ n) в 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

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

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 Ответ

14 голосов
/ 03 мая 2011

Документация для -[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 в исходном коде.

...