【问题标题】:How to disable font smoothing in Xcode 9?如何在 Xcode 9 中禁用字体平滑?
【发布时间】:2018-01-28 14:26:24
【问题描述】:

我有一个很棒的编程字体Deccy,只有在 Xcode 中禁用字体平滑(抗锯齿)时才看起来不错。使用 Xcode 8,以下方法可以解决问题:

defaults write com.apple.dt.Xcode NSFontDefaultScreenFontSubstitutionEnabled -bool YES
defaults write com.apple.dt.Xcode AppleAntiAliasingThreshold 24

但这不再适用于 Xcode 9。

是否可以在 Xcode 9 中禁用字体平滑?

【问题讨论】:

标签: ios iphone xcode ide xcode9


【解决方案1】:

恶作剧管理?

这是我的 Xcode 9 的屏幕截图,带有 Deccy 在 13pt:

我相信以上就是你想要的。这是显示相同文件的股票 Xcode:

但是怎么做呢?

我深入探索了一种非侵入性的方法来实现这一点,但失败了。据我所知,Xcode 9 中的文本渲染路径非常刻意开启字体平滑。

在继续之前,请向 Apple 提交功能请求。只需几分钟,这是您在安全本能良好且心血管系统紧张的人面前讨论答案的最大希望:

https://bugreport.apple.com/

我写了一个 Xcode 插件。您可能听说过 Xcode 9 使用代码签名限制来禁止加载插件。这是真的,但有一些小牛队继续前进,今晚我们与他们一起骑行。

第一步

有一个工具,update_xcode_plugins。您可以使用它从您的 Xcode 副本中去除代码签名,并使用它来限制包加载:

$ gem install update_xcode_plugins
$ update_xcode_plugins --unsign

如果您改变主意,可以执行此操作以恢复(我认为是备份副本?)签名的 Xcode:

$ update_xcode_plugins --restore

第二步

还有另一个工具,Alcatraz。它是 Xcode 的插件管理器。我选择安装它是因为它提供了一个插件,它为插件提供了一个项目模板。我跟着these instructions 安装了 Alcatraz,归结为:

$ git clone https://github.com/alcatraz/Alcatraz.git
$ cd Alcatraz
$ xcodebuild

我启动了 Xcode,点击了警告我新插件的对话框,然后使用新添加的 Window > Package Manager 安装“Xcode Plugin”模板。

第三步

我用这个模板做了一个项目。

在我撰写本文时,“Xcode 插件”模板尚未更新以支持 Xcode 9。不用担心。我运行这个命令来获取 Xcode 9 的兼容性 UUID:

$ defaults read /Applications/Xcode.app/Contents/Info DVTPlugInCompatibilityUUID

我访问了我的新项目的 Info.plist 并将该 UUID 添加到 DVTPlugInCompatibilityUUIDs 数组中。

然后,我将SourceEditor.framework 链接到我的项目中。这是一个两步过程:

  1. 访问目标的构建设置。将此添加到框架搜索路径:

    /Applications/Xcode.app/Contents/SharedFrameworks/
    
  2. 访问目标的构建阶段。添加一个新的“Link Binary With Libraries”阶段。打加号。导航到上面的目录(您只需按 / 键,然后将路径粘贴进去)并选择SourceEditor.framework。它应该出现在列表中。该项目仍应构建。

然后,我让我的插件的.mm 文件看起来像这样(我删除了.h 文件,这个PoC 不需要它):

#import <AppKit/AppKit.h>
#include <dlfcn.h>

extern void CGContextSetAllowsFontAntialiasing(CGContextRef, BOOL);

static void hooked_sourceEditorSetFontSmoothingStyle(CGContextRef ctx) {
    CGContextSetAllowsFontAntialiasing(ctx, NO);
}

@interface NoAA : NSObject
@end

@implementation NoAA

+ (void)pluginDidLoad:(NSBundle *)plugin
{
    NSArray *allowedLoaders = [plugin objectForInfoDictionaryKey:@"me.delisa.XcodePluginBase.AllowedLoaders"];
    if (![allowedLoaders containsObject:[[NSBundle mainBundle] bundleIdentifier]])
        return;

    Class cls = NSClassFromString(@"SourceEditorScrollView");
    NSBundle* bundle = [NSBundle bundleForClass:cls];
    void *handle = dlopen(bundle.executablePath.fileSystemRepresentation, RTLD_NOW);
    if (!handle)
        return;
    uint8_t* set_font_smoothing_fn = dlsym(handle, "sourceEditorSetFontSmoothingStyle");
    if (!set_font_smoothing_fn)
        goto fin;
    void* set_font_smoothing_fn_page = (void*)((long)set_font_smoothing_fn & -PAGE_SIZE);
    if (mprotect(set_font_smoothing_fn_page, PAGE_SIZE, PROT_READ | PROT_WRITE | PROT_EXEC))
        goto fin;
    set_font_smoothing_fn[0] = 0xe9; // jmp
    uint32_t* jmp_arg = (uint32_t*)(set_font_smoothing_fn + 1);
    *jmp_arg = (uint32_t)((long)hooked_sourceEditorSetFontSmoothingStyle - (long)(jmp_arg + 1));
    mprotect(set_font_smoothing_fn_page, PAGE_SIZE, PROT_READ | PROT_EXEC);

fin:
    dlclose(handle);
}

@end

…我认为gotos 添加了字符。基本上,它只是定义了一个接受CGContextRef 并为其关闭文本抗锯齿的函数。然后,它会覆盖 SourceEditor 框架内的函数的开头,该框架通常配置抗锯齿设置(不再需要)以跳转到我们的函数。它以极其不安全的方式完成所有这些工作,因此如果出现问题,Xcode 可能会礼貌地崩溃。

构建并运行项目,它会自动安装插件。接受添加您的插件,就是这样。

现在怎么办?

如果这里有什么因为我搞砸了而不起作用,请告诉我。我打算自己将它加入 Alcatraz 插件,但你或其他任何人都应该免费这样做(在向 Apple 提交功能请求后)。

黑客愉快!

【讨论】:

  • 安装 Alcatraz 后,在 New Project 对话框中找不到 Xcode Plugin 模板选项。然而,我可以使用这个plugin project 作为模板。然后它起作用了。谢谢。
  • 安装 Alcatraz 后,从 Window -> Package Manager 启动它并从“模板”选项卡安装模板。然后,它应该一直显示在 New Project 窗口的 macOS 选项卡的底部。
  • Deccy 最好在 12.5 观看!
  • 希望你能以某种方式选择那个尺寸?
  • 仅供参考使用从包管理器中的“模板”选项卡安装的 kattrali/Xcode-Plugin-Template,您无法链接任何二进制文件或框架,缺少“将二进制文件与库链接”阶段.
【解决方案2】:

如果您“生活”在 XCode 中并且需要清晰呈现这种 TrueType 字体,那么编辑 XCode 应用程序默认使用 PrefEdit.appdefaults write com.apple.dt.Xcode.* 无效。

跳出框框思考,您可能对以下内容感兴趣,以在您的 Mac 上实现松脆。

由于 Deccy 字体最好在 12pt 处查看,因此将全局域中的 AppleAntiAliasingThreshold 提高到 13 是有意义的,此设置的默认值为 4。
您也可以不建议 AppleFontSmoothing

defaults write -g AppleFontSmoothing -int 0 defaults write -g AppleAntiAliasingThreshold -int 13

除了这些调整之外,还可以在系统偏好设置中的 辅助功能偏好设置 窗格中实现更多功能:显示器有 2 个您应该尝试的复选标记:'Differentiate without color'和'增加对比度'。

“美在旁观者的眼中”我希望这会有所帮助。

【讨论】:

  • 您的解决方案实际上是否适用于 Deccy 和 Xcode 9?
  • 截图是XCode中的Deccy。
  • 截图上的字母好像不清晰
  • 那是因为 Caddy 字体是旧格式 TrueType
  • 它曾经在 Xcode 8、7 和 6 中很清晰。你的回答远没有任何帮助。
【解决方案3】:

以下是可能对您有用的替代步骤。

  1. 尝试在 Macintosh HD/Library/Preferences 下找到 com.apple.dt.Xcode.plist 文件。
  2. 将文件复制到桌面
  3. 打开文件并将 NSFontDefaultScreenFontSubstitutionEnabled 添加到 (Boolean)YES
  4. 将 AppleAntiAliasingThreshold 添加到 (Number)24
  5. 将此文件替换为首选项文件
  6. 重启系统和Xcode

注意:为了安全起见,请保留原始文件的备份。

【讨论】:

  • 你真的测试过吗?它不起作用。由于字体平滑,文本仍然变得模糊。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-19
  • 2012-09-26
  • 2015-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多