gpt4 book ai didi

objective-c - 在 Cocoa 中激活字体时从 NSFontManager 获取更新的 availableFonts

转载 作者:行者123 更新时间:2023-12-03 16:32:48 25 4
gpt4 key购买 nike

我发布了一个关于使用 Python 做同样事情的类似问题,但我使用 Objective-C 和 Cocoa 重写了这个小程序并得到了相同的结果。这是我的另一个 Stack Overflow 问题:https://stackoverflow.com/questions/8980677/polling-nsfontmanager-sharedfontmanager-in-python再次提交问题的目的是为了联系Objective-C和Cocoa专家,谁知道呢,也许答案会不同。所以就这样了。

我正在尝试编写一个小型终端程序,它将获取 OS X 视为事件的字体列表,并报告一段时间内有多少是事件的。例如,当程序运行时,如果我有 120 个事件字体,它应该报告 120 个事件字体,那么如果我在程序运行时激活 10 个以上字体,它应该报告 130 个事件字体。我遇到的问题是,sharedFontManager 实例似乎没有在我的 for 循环中更新。这是我正在使用的代码:

#import <Foundation/Foundation.h>
#import <AppKit/AppKit.h>

int main (int argc, const char * argv[])
{

@autoreleasepool {
for(int y=0; y < 5; y++){

NSArray *sysFonts;
NSFontManager *manager = [NSFontManager sharedFontManager];
sysFonts = [manager availableFonts];

NSLog(@"Number of active fonts: %lu", [sysFonts count]);
sleep(5);
sysFonts = nil;
}

}
return 0;
}

因此,如果您想对此进行测试,您将需要数百种字体来激活和停用。首先停用字体(选择字体,右键单击,选择“禁用字体”)。运行程序。当您看到终端显示“事件字体数量:”弹出回字体簿时,右键单击所选字体,然后单击“启用字体”(随意将 sleep(5) 更改为更长或更短的值。数量为以秒为单位),它将重复循环 5 次(同样,您也可以更改此数字)。

我最终得到的结果是相同数量的激活字体,但我知道这是不准确的,因为如果您激活了大量字体(大约 500 种字体),您有足够的时间重新运行程序,您会发现该数量与上次运行该程序时相比有所减少或增加,具体取决于您是否激活或停用了大量字体。换句话说,我知道正在发生字体激活,并且我希望看到字体数量发生变化。

任何帮助或指导将不胜感激。

最佳答案

您可以运行NSRunLoop并使用NSFontSetChangedNotification机制来更新sharedFontManager实例!

/*

Getting updated availableFonts from NSFontManager while activating fonts in Cocoa
http://stackoverflow.com/questions/8995017/getting-updated-availablefonts-from-nsfontmanager-while-activating-fonts-in-coco

references:
- NSFontAttributeExplorer
https://developer.apple.com/library/mac/#samplecode/NSFontAttributeExplorer/Introduction/Intro.html%23//apple_ref/doc/uid/DTS10003960
https://developer.apple.com/library/mac/samplecode/NSFontAttributeExplorer/NSFontAttributeExplorer.zip
- NSFontManager Class Reference
https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/ApplicationKit/Classes/NSFontManager_Class/Reference/Reference.html
- http://stackoverflow.com/questions/8336693/on-nsrunloop-clarification-needed
- /System/Library/Frameworks/AppKit.framework/Versions/C/Headers/NSFont.h


compile with:
gcc -Wall -Wextra -x objective-c -framework AppKit -o getfonts getfonts.m

usage:

./getfonts

( ./getfonts > font.log ) &
pid=$!
# kill -HUP $pid


# play around with "Disable selected fonts" & "Enable selected fonts" button
open -a 'Font Book'

*/


#import <AppKit/AppKit.h>


// create a counter to avoid createFontList() being called twice for a single font adding / removing event
// Is there any alternative?
static int counter = 0;


@interface FontLogger : NSObject
{
NSFontManager *mysharedFontManager;
}
- (id)init;
-(void)createFontList;
@end


@implementation FontLogger

- (id)init
{
if ((self = [super init]))
{
mysharedFontManager = [NSFontManager sharedFontManager];
[self createFontList];
}
return self;
}


-(void) setNSFontSetChangedNotification
{
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(fontSetChanged:) name: NSFontSetChangedNotification object: nil];
}

-(void)createFontList
{

counter = counter + 1;

if (counter == 1)
{
NSString *name = NULL;
NSArray *fontarray = [mysharedFontManager availableFonts];
NSEnumerator *nameEnum = [fontarray objectEnumerator];

int i = 0;
while ( (name = [nameEnum nextObject]) )
{
//NSLog(@"font: %@", name);
printf("%s\n", [name UTF8String]);
i = i + 1;
}
printf("Number of available fonts: %i\n\n", i);
fflush(stdout);

}else {
counter = 0;
}

}

- (void)fontSetChanged:(NSNotification *)notification
{

if ([[notification name] isEqualToString:@"NSFontSetChangedNotification"])
{
[self createFontList];
//NSLog (@"Successfully received notification!");
}

}

@end


int main (void)
{

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

FontLogger *getAvailableFonts = [[[FontLogger alloc] init] autorelease];

[getAvailableFonts setNSFontSetChangedNotification];

BOOL terminated = NO;

while(!terminated && [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]);

[pool release];

return 0;

}

关于objective-c - 在 Cocoa 中激活字体时从 NSFontManager 获取更新的 availableFonts,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8995017/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com