Можно установить либо выравнивание, либо шрифт, но не оба, для NSTextField

У меня есть наконечник панели с выходом для одного из его текстовых полей, который установлен в наконечнике для выравнивания по центру. Когда я показываю панель, я бы хотел, чтобы это текстовое поле было выделено жирным шрифтом. Поскольку NSTextField является подклассом NSControl, он может использовать метод setAttributedStringValue и принимать строку с атрибутами. Поэтому я включил жирный шрифт следующим образом:

NSFont *fontBolded = [NSFont fontWithName:@"Baskerville Bold" size:12.0f];
NSDictionary *dictBoldAttr = [NSDictionary dictionaryWithObject:fontBolded forKey:NSFontAttributeName];   
NSString *sHelloUser = NSLocalizedString(@"Hello User", @"Hello User");
NSAttributedString *attrsHelloUser = [[NSAttributedString alloc] initWithString: sHelloUser attributes:dictBoldAttr];
[self.fooController.tfPanelCenteredField setAttributedStringValue:attrsHelloUser];  
[attrsHelloUser release];

Выделение жирным шрифтом отображается нормально, но теперь поле выровнено по левому краю.

Я попытался добавить setAlignment, но это не дало никакого эффекта:

[self.fooController.tfPanelCenteredField setAlignment:NSCenterTextAlignment];

Поэтому я попытался добавить стиль параграфа по центру к атрибутам строки с атрибутами:

NSFont *fontBolded = [NSFont fontWithName:@"Baskerville Bold" size:12.0f];
NSMutableParagraphStyle *paragStyle = [[NSParagraphStyle defaultParagraphStyle] mutableCopy];   
[paragStyle setAlignment:NSCenterTextAlignment]; 
NSDictionary *dictBoldAttr = [NSDictionary dictionaryWithObjectsAndKeys:paragStyle, NSParagraphStyleAttributeName, fontBolded, NSFontNameAttribute, nil];
NSString *sHelloUser = NSLocalizedString(@"Hello User", @"Hello User");
NSAttributedString *attrsHelloUser = [[NSAttributedString alloc] initWithString: sHelloUser attributes:dictBoldAttr];
[self.fooController.tfPanelCenteredField setAttributedStringValue:attrsHelloUser];  
[attrsHelloUser release];
[paragStyle release];

Теперь текстовое поле снова центрировано, но жирный шрифт исчез. Как будто строка с атрибутами может принимать одну настройку атрибута и только одну. Я пропустил что-то простое?


person Wienke    schedule 06.11.2011    source источник


Ответы (1)


У вас опечатка в коде. NSFontNameAttribute должно быть NSFontAttributeName.

Итак, ваш словарь атрибутов:

    NSFont *fontBolded = [NSFont fontWithName:@"Baskerville Bold" size:12.0f];
    NSMutableParagraphStyle *paragStyle = [[NSParagraphStyle defaultParagraphStyle] mutableCopy];   
    [paragStyle setAlignment:NSCenterTextAlignment]; 
    NSDictionary *dictBoldAttr = [NSDictionary dictionaryWithObjectsAndKeys:
                                  fontBolded, NSFontAttributeName,
                                  paragStyle, NSParagraphStyleAttributeName,
                                  nil];
person Francis McGrew    schedule 06.11.2011
comment
Спасибо! Извините, что потратил ваше время на это, но я бы никогда не понял этого, потому что смысл кода окрашивает опечатку так, как будто она действительна. (P.S. Почему в этих ключах вообще есть имя? Разве NSFontAttribute и NSParagraphStyleAttribute не имеют больше смысла?) - person Wienke; 06.11.2011
comment
Теперь я вижу, что NSFontNameAttribute является атрибутом NSFontDescriptor и представляет собой строку для имени шрифта. Но NSFontAttributeName в NSAttributedString предназначен для font, а не для строки fontName, поэтому это обязательно вызовет путаницу. - person Wienke; 06.11.2011