2013-06-22 47 views
1

我想知道是否可以在popupbutton控件中显示实时字体(NSPopupButton)?目前,我用以下方式加载一个带有可用字体列表的popupbutton。NSPopupButton with Live Fonts(Styled Text)

NSArray *familyNames = [[NSFontManager sharedFontManager] availableFontFamilies]; 
NSMutableArray *fontarray = [[NSMutableArray alloc] initWithObjects:nil]; 
[fontarray addObject:@"- Select one - "]; 
for (NSString *family in familyNames) { 
    [fontarray addObject:family]; 
} 
[fontmenu1p addItemsWithTitles:fontarray]; 

也许,如下所示,使用NSMutableAttributedString?

for (NSString *family in familyNames) { 
    NSDictionary *attr1 = [NSDictionary dictionaryWithObjectsAndKeys:[NSFont fontWithName:family size:[NSFont systemFontSize]],NSFontAttributeName,[NSColor blackColor],NSForegroundColorAttributeName,nil]; 
    NSMutableAttributedString *aString = [[NSMutableAttributedString alloc] initWithString:family]; 
    [aString setAttributes:attr1 range:NSMakeRange(0,family.length-1)]; 
    [fontarray addObject:aString]; 
} 
[fontmenu1p addItemsWithTitles:fontarray]; 

我得到一个越界的错误。我不知道我的方法是否正确。我甚至不知道popupbutton控件是否支持样式文本。

谢谢你的帮助。

+0

你从哪里得到越界误差? – gaige

+0

我认为这是最后一行。因为有超过一百种字体需要遵循,所以我无法确切地说。谢谢。 –

+0

我的第一个想法是fontarray可能是空的。事实上,事实并非如此。如果我计算物品的数量,我会得到348。事实上,如果我用NSLog显示其中一个对象,我会得到以下结果。 Arial Blac {NSColor =“NSCalibratedWhiteColorSpace 0 1”; NSFont =“\”Arial-Black 13.00 pt。 P [](0x100528bc0)fobj = 0x101b36150,spc = 4.34 \“”;所以我猜NSPopupButton不能显示样式文本?那么,你可以用VisualBasic/C#来做到这一点。所以我认为我可以用Objective-C来做到这一点。 –

回答

3

即使我没有测试过,我认为我们的方法无效。 NSPopUpButton为其菜单提供了一个方便的API。方便,但很短。 (通常弹出的项目不归属,没有单独的视图等等。)

我会尝试为每个项目构建NSMenuItem的实例。有一个setter -setAttributedTitle:,它可以让你设置属性字符串。然后,您必须将其聚合到NSMenuset the menu的实例到弹出按钮。

BTW:[aString setAttributes:attr1 range:NSMakeRange(0,family.length-1)]; 为什么-1?长度是长度,而不是最后一个字符的索引。并且您想设置一个范围,该范围取决于长度,而不是最后一个字符的索引。

+0

嗯...我首先将尺寸设置为family.length。看到一个错误后,我将其更改为family.length - 1.我不确定。感谢您指出了这一点。 –

+0

当然:你有索引问题,这是减少范围的第一件事。但我不认为这是问题。 –