ios - 在WKWebView中,使用自定义字体的ios

  显示原文与译文双语对照的内容
117 0

我在应用程序中使用自定义字体。 它们被复制到捆绑包并硬编码到 appName-info.plist 。 这种字体在整个应用程序和UIWebView中都非常完美。

加载 htmlString [webView loadHTMLString:htmlString baseURL:nil]; 我在 web view中使用了以下字体: fontFamily: fontName

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

我试图在基本url中加载主包路径,在css中使用 font-face - WkWebView仍然显示随机字体。

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

我的英语很抱歉

时间: 原作者:

118 4

我遇到同样的问题,在我的情况下,我可以用的base64编码和英镑的GCDWebServer来固定它。

方案:

  • WkWebView加载是通过字符串 html
  • WkWebView正在使用本地。css
  • 字体是本地的,并在顶层项目中添加
  • 字体的条目在 appName-info.plist 中提供,关键字如下 Fonts provided by application

解决方案:

按如下方式在. css 中的中添加 font-face


@font-face


{


 font-family: 'FontFamily';


 src: local('FontFamily'),url('FontFileName.otf') format('opentype');


}



演示项目:

GitHub项目链接

我已经用秒的时间做了Fresh的演示,我对它进行了测试,因为它与UIWebView一样工作,没有滞后。 在WKWebView中,字体的字体可能比UIWebView小。

原作者:
113 3

假设你将应用程序中的字体嵌入到目标包中,可以通过传递WKWebView访问该字体的。


NSString *bundlePath = [[NSBundle mainBundle] bundlePath];


NSURL *bundleUrl = [NSURL fileURLWithPath:bundlePath];


[self.webView loadHTMLString:HTML baseURL:bundleUrl];



并且定义了没有任何前沿路径元素的font-face url,而这又使WKWebKit在,


<style>


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


. . .


</style>



108 0

因为我不想使用另一个第三方,因为我正在构建html字符串本身,而是使用 font-face 而不是使用 url 。

CSS的外观如下:


@font-face {


 font-family: 'FONTFAMILY';


 src: url(data:font/ttf;base64,FONTBASE64) format('truetype');


}



你可以用需要的族替换 FONTFAMILY,并使用从字体生成的Base 64 字符串替换 FONTBASE64.

如果需要在应用程序中创建base64字符串,可以使用该字符串,只提供文件名和类型( 我用它来获取它的他文件,以便更通用,可以删除,参数并使用 @"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/

59 3

我猜,WKWebView 不再能访问应用程序特定的字体,因为它现在是一个单独的进程( XPC ) 。

我通过在CSS中添加带有 @font-face 声明的字体来解决这个问题。 有关MDN的详细信息,请参阅这里的

例如:


@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 不能执行( 假设你已经发现了这一点,因为你正在加载一个HTML字符串而不是本地文件) 。 根据关于的评论,我可以使用GCDWebServer插件来获取本地HTML文件。 在你的App Delegate 中,在将相关文件添加到你的项目中,按照GitHub上的GCDWebServer:


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];



在HTML文件( 如果你真的需要加载字符串,则在你的HTML字符串中) 中的style 元素中放置上述 @font-face 声明,你应该能够。

原作者:
...