iOS的UIWebViews自定义字体路径

4

我有一个UIWebView,并且我有一个自定义字体,我想加载到可编辑的HTML文档中,然后通过UIWebView显示。在我的SupportingFiles(资源)文件夹中,我有“Nosifer-Regular.ttf”…为了在我的HTML中使用自定义字体,我需要该字体文件的路径(URL)…我尝试这样做,但似乎没有起作用…有什么想法吗?

bundle = [NSBundle mainBundle];
    pathFont = [bundle bundlePath];
    fontURL = [NSBundle pathForResource:@"Nosifer-Regular" ofType:@"ttf" inDirectory:pathFont];
    path_font = [fontURL stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    fileAppend = [[NSString alloc] initWithFormat:@"file://"];
    path_font = [[NSString alloc] initWithFormat:@"%@%@", fileAppend, path_font];

HTML(CSS):

@font-face {
  font-family: 'Nosifer';
  font-style: normal;
  font-weight: 400;
  src: local('Nosifer'), local('Nosifer-Regular'), url('%@') format('truetype');
}

其中的 %@ 被替换为“path_font”(在第一个代码块中定义)


这看起来是一个很好的答案,但我似乎无法让它工作 - 无论我做什么,我的自定义字体(嵌入为资源)都没有被使用。你能否发布一个工作代码示例,展示这个问题的解决方案?接受答案中的扩展注释似乎包含了解决方案(例如使用“而不是',但我不确定在哪里)。 - MusiGenesis
你是否从应用程序包加载内容?确保在创建URL时传递的 baseURL 参数指向你的应用程序资源文件夹。 - nielsbot
@nielsbot 谢谢!唯一的问题是,在iOS中的UIWebView中,CSS需要在字体类型周围使用双引号,单引号不起作用...这与CSS无关(在_REAL_ CSS中任何一个都可以工作),但是苹果为某种原因编写的UIWebViews不起作用...我将我的单引号改为双引号,接受答案(下面)的代码就可以正常工作。 - Albert Renshaw
@AlbertRenshaw,嗨,我正在尝试做几乎相同的事情,但没有成功,你认为你能看一下我的问题吗:https://dev59.com/U1UL5IYBdhLWcg3wYHHD - coder
4个回答

4

首先,在你的info.plist中添加字段“应用提供的字体”。它将是一个数组,如下所示

item0 myFont.otf
item1 anotherFont.ttf

或者其他什么。

在 HTML 中使用 font-face 添加字体。并将字体文件与 html 文件放置在同一目录中。如果 HTML 是动态生成的,而不是从捆绑包中显示,则应复制字体。

祝你好运。


1
你是否将字体从bundle复制到与HTML相同的目录中? - Pavel Oganesyan
我正在将我的HTML保存在这个目录中docsDir = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];我使用NSLOG记录了字体文件的位置,它们在这里:file:///var/mobile/Applications/************/****.app/AlmonteSnow.ttf - Albert Renshaw
那么我想我需要将字体文件放在与docsDir相同的位置,我该如何手动操作? - Albert Renshaw
1
[[NSFileManager defaultManager] copyItemAtPath:src toPath:dst error:&error; - Pavel Oganesyan
1
这是我保存然后加载到WebView中的HTML代码:

在此插入文本

- Albert Renshaw
显示剩余10条评论

1

我这里有一个可用的HTML代码示例。

<html>
<head>
    <style type='text/css'>
        p.p1 {margin: 0.0px 0.0px 0.0px 30.0px; font: 34.0px;}
        @font-face {
            font-family: 'Nosifer'; font-style: normal; font-weight: 400; src: local('Nosifer'), local('Nosifer-Regular'), url('Nosifer-Regular.ttf') format('truetype');
        }

        .nosifer {
            font-family: Nosifer;
        }

        </style>
</head>
<body allowtransparency='true'>
    <p class="nosifer">Nosifer ABCabc</p>
</body>

正如您所看到的,我使用了CSS类来更轻松地定义字体。我不确定font-face中所有CSS代码的含义,但它似乎起作用。

我确认您需要将“Nosifer-Regular.ttf”添加到应用程序在*-info.plist文件(键:应用程序提供的字体)中提供的字体数组中。 顺便说一下,我在一个嘈杂的网站上谷歌了Nosifer-Regular.ttf并找到了它。它确实有效:http://www.ffonts.net/Nosifer.font.download

然后,我还能够加载OTF,我将在我的情况下使用。在CSS中,我将格式从truetype更改为opentype。


这在HTML中应该可以正常工作...问题在于我试图在iOS上运行它,所以CSS中的"url"部分必须使用双引号而不是单引号,因此我用url("...")替换了url('....')。再次强调,这只发生在iOS上...您的代码在普通网站浏览中将正常工作。 - Albert Renshaw
我在iOS中使用了这段代码。只需将其放入html文件中,将文件添加到bundle中,然后将文件加载到NSString中...类似于[[NSString alloc] initWithContentsOfFile ... 它可以工作,尽管对于我的需求,我发现使用UILabel有更好的方法。总的来说,在iOS上文本处理真的很弱 :-( - Jonny
哦,你用的是哪个版本?不知为何,当我最初发布这个问题时,它就是不起作用!嗯 :) 哈哈 - Albert Renshaw

1
在您的项目中添加自定义字体。然后获取字体名称。
 UIFont *font = [UIFont fontWithName:@"Your-Custom-font" size:20];

然后创建HTML字符串。
NSString *htmlHeader=[NSString stringWithFormat:@"<html><head><head><link rel=\"stylesheet\" type=\"text/css\" href=\"file://localhost%@\"></head><body><font face=\"%@\"; size=\"4\">HI</font></body></html>",cssPath,font.familyName];

祝你好运。


0

以下是如何将字体添加到您的 Info.plist 文件中:

    <key>UIAppFonts</key>
    <array>
        <string>Nosifer-Regular.ttf</string>
    </array>

然后按照这个答案的方法使用@font-face。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接