在WKWebView中使用自定义字体

我在我的应用程序中使用自定义字体。 他们被复制捆绑和硬编码到appName-info.plist。 这个字体在整个应用程序和UIWebView中完美工作。

我加载htmlString [webView loadHTMLString:htmlString baseURL:nil]; 我在webView中使用这个字体与CSS: fontFamily: fontName

但是,当我尝试使用WkWebView自定义字体不工作。 WkWebView显示随机默认字体。

我试图加载它与基本url中的主包path,并在CSS中使用font-face – WkWebView仍然显示随机字体。

任何想法如何使自定义字体在WKWebView中工作?

对不起我的英语不好

由于我不想为此使用另一个第三方,并且由于我自己构build了htmlstring,所以我使用font-face的第一部分,而不是使用url来远程或本地文件,我将字体转换为base64。

CSS看起来像这样:

 @font-face { font-family: 'FONTFAMILY'; src: url(data:font/ttf;base64,FONTBASE64) format('truetype'); } 

您可以将FONTFAMILYreplace为您需要的系列,并将FONTBASE64replace为由字体生成的基本64string。

如果你需要在你的应用程序中创buildbase64string,你可以使用这个,只是提供文件名和types(我用它来获取其他文件,所以它更通用,你可以删除ofType参数,并使用@“ttf”代替):

 - (NSString*)getBase64FromFile:(NSString*)fileName ofType:(NSString*)type { NSString * filePath = [[NSBundle mainBundle] pathForResource:fileName ofType:type]; // Create NSData object NSData *nsdata = [NSData dataWithContentsOfFile:filePath]; // Get NSString from NSData object in Base64 NSString *base64Encoded = [nsdata base64EncodedStringWithOptions:0]; return base64Encoded; } 

如果只想执行一次,然后将其保存在某个文件中,则可以使用将文件转换为base64的任何在线网站,如下所示: http : //www.opinionatedgeek.com/dotnet/tools/base64encode/

我面临同样的问题,在我的情况下,我可以修复它, 而不使用base64编码GCDWebServer

场景:

  • WkWebView加载是通过string的HTML
  • WkWebView使用本地.css
  • 字体是本地的,并在顶级项目中添加
  • Fonts provided by applicationFonts provided by application下的appName-info.plist中提供了字体条目

解:

在顶级的.css中添加字体,如下所示

 @font-face { font-family: 'FontFamily'; src: local('FontFamily'),url('FontFileName.otf') format('opentype'); } 

DEMO项目:

GitHub项目链接

:新的演示应用程序运行可能需要2-3秒,我已经testing了它长的HTMLstring,它与UIWebView相同,没有滞后。 在WKWebView中,相同的字体可能会比UIWebView小一些。

假设您将字体embedded到应用程序中作为复制到目标包的资源,您可以通过将NSURL作为baseURL文件夹传递给WKWebView访问该字体

 NSString *bundlePath = [[NSBundle mainBundle] bundlePath]; NSURL *bundleUrl = [NSURL fileURLWithPath:bundlePath]; [self.webView loadHTMLString:HTML baseURL:bundleUrl]; 

并定义没有任何前面的path元素的font-face url,这反过来使WKWebKit预先添加baseURL

 <style> @font-face { font-family: 'Custom Font'; src: url('CustomFont.ttf'); } ... </style> 

我的猜测是, WKWebView无法再访问特定于应用程序的字体,因为它现在处于一个单独的进程(XPC)中。

我通过在CSS中添加@font-face声明的字体来解决这个问题。 有关如何执行此操作的详细信息,请参阅此处 。

例:

 @font-face { font-family: "MyFontFace"; src:url('url-to-font.ttf'); } //And if you have a font with files with different variants, add this: @font-face { font-family: "MyFontFace"; src:url('url-to-italic-variant.ttf'); font-style:italic; } 

但是这将引用一个本地文件, WKWebView不能做(我假设你已经发现了这个,因为你正在加载一个HTMLstring,而不是本地文件)。 根据对这个问题的评论,我能够使用GCDWebServer让我的本地HTML文件工作。 在您的应用程序委托中,按照GitHub上的GCDWebServer的wiki将相关文件添加到项目之后:

 GCDWebServer *server = [[[GCDWebServer alloc]init]autorelease]; NSString *bundlePath = [[NSBundle mainBundle] bundlePath]; [server addGETHandlerForBasePath:@"/" directoryPath:bundlePath indexFilename:nil cacheAge:0 allowRangeRequests:YES]; [server startWithPort:8080 bonjourName:nil]; 

现在你可以在你的包中引用一个名为test.html的HTML文件,如下所示:

 NSString *path = @"http://localhost:8080/test.html"; NSURL *url = [NSURL URLWithString:path]; NSURLRequest *request = [NSURLRequest requestWithURL:url]; [myWebView loadRequest:request]; 

把前面提到的@font-face声明放在你的HTML文件的style元素中(或者如果你真的只需要加载一个string的话,在你的HTMLstring中),你应该很好。

这里是@Henrik Hartz的一个快速的3个版本真棒回答:

 loadHTMLString(htmlString, baseURL: NSURL.fileURL(withPath: Bundle.main.bundlePath))