首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >激活Cocoa中的字体时从NSFontManager获取更新的availableFonts

激活Cocoa中的字体时从NSFontManager获取更新的availableFonts
EN

Stack Overflow用户
提问于 2012-01-25 06:11:38
回答 1查看 1.4K关注 0票数 2

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

我正在尝试写一个小的终端程序,它将获得OS X认为活跃的字体列表,并报告一段时间内活跃的字体数量。例如,当程序运行时,如果我有120个激活的字体,它应该报告120个激活的字体,那么如果我在程序运行时激活另外10个字体,它应该报告130个激活的字体。我遇到的问题是,在我的for循环中,sharedFontManager实例似乎没有更新。下面是我正在使用的代码:

代码语言:javascript
复制
#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;
}

因此,如果你想测试它,你将需要几百个字体来激活和停用。从停用字体开始(选择字体,右键单击,选择“禁用字体”)。运行程序。当您看到终端显示"Number of active fonts:“时,弹回Font Book,右键单击所选字体,然后单击"Enable Fonts”(随时将睡眠(5)更改为更长或更短的字体。数字以秒为单位),它将重复循环5次(同样,您也可以更改此数字)。

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

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

EN

回答 1

Stack Overflow用户

发布于 2012-02-06 02:26:50

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

代码语言:javascript
复制
/*

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;

}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8995017

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档