【问题标题】:How to format text in WKWebView by wrapping it into HTML using Swift iOS?如何通过使用 Swift iOS 将 WKWebView 中的文本包装成 HTML 来格式化文本?
【发布时间】:2017-01-15 00:05:03
【问题描述】:

我正在将文本加载到 WKWebView 中。我的目标是:

  1. 将字体大小设置为固定值
  2. 在 WKWebView 中垂直对齐文本
  3. 在 WKWebView 中水平对齐文本

我无法在 WKWebView 上找到可以做到这一点的函数。所以我试图将字符串包装成一些 HTML 代码。

这是我的代码:

func loadQuestions() {
    questionView.questionLabel.text = questionArray[questionIndex].questionText

    let questionText: String = questionArray[questionIndex].questionText!
    let answerText: String = questionArray[questionIndex].answerText!

    let htmlWrap = "<p>\(questionText)</p><p>\(answerText)</p>"

    answerView.webView.loadHTMLString(htmlWrap, baseURL: nil)
}

这可行,但是当我尝试添加一些使用转换器网站获得的高级格式时(因为我不知道 html),我得到了所有使我的字符串无效的引号 (")。

let htmlWrap = "<p style="text-align: center;"><span style="font-size: 36pt;">\(questionText)</span></p><p style="text-align: center;"><span style="font-size: 36pt;">\(answerText)</span></p>"

上面的不会编译。

似乎我可以在每个引号(“)之前在html字符串中使用转义字符(\),如果它是一条简单的行,这似乎可以工作。但不适用于复杂的html。那我该怎么做这个?

谢谢!

【问题讨论】:

    标签: html css swift swift3 wkwebview


    【解决方案1】:

    两种方式:
    如您所知,使用 \ 是解决此问题的好方法,因为对于 Swift,字符串以 " 开头并以 " 结尾。在 " 之前添加 \ 将其转换为字符串的一部分,而不是指定字符串结尾的控制字符。因此,您可以复制转换器的输出并将其粘贴到文本编辑器中,然后查找 " 并将其替换为 \"。如果您想在 HTML 字符串中使用 " 则没有其他方法(如果排除了使用 API 直接从转换器获取 html 字符串以存储到变量中的选项)。

     另一种方法是在 HTML 字符串中使用 ' 而不是 "。因此,您必须再次将转换器的输出复制到文本编辑器并查找并替换 " 为 '。

    【讨论】:

      【解决方案2】:

      方法一:转义

      正如您在最初的问题中提到的那样,您始终可以通过添加前缀“\”字符来转义任何嵌入的引号字符。如果你走这条路,我会在全局查找和替换中进行两次传递:首先将单个反斜杠 () 替换为两个反斜杠,然后将每个引号替换为 \"。

      方法2:多行字符串文字

      从 Swift 4.0 开始(现在一年半),您还可以使用 multiline string literals,它以“””(三个双引号)为界,让自己走上正轨。你会这样做:

      let htmlWrap = """
          <p style="text-align: center;"><span style="font-size: 36pt;">\(questionText)</span></p><p style="text-align: center;"><span style="font-size: 36pt;">\(answerText)</span></p>"
          """
      

      第一个换行符(在 "

      缩进到终止 """ 点将被保留。例如,上面的字符串将 not 包括我放的额外的四空格缩进在代码示例中,因为终止的 """ 也缩进了四个空格。

      从其他生成器中取出文本并在多行文字字符串标记之间插入文档通常应该是一种安全的复制粘贴,除非在非常奇怪的情况下,您的 HTML 中实际上有三个引号(它没有特殊含义在 HTML 中,只有当您的纯文本中包含该结构时才会出现,例如如果您引用了这个答案)。

      然而,需要注意的重要一点是,多行文字中的转义仍然会转义。所以,这样的事情不会像它所写的那样结束:

      let testing = "Testing 123"
      let htmlWrap = """
          <p>\(testing)</p>
          """
      

      ...最终会在您的 Web 视图中打印“Testing 123”。

      方法 3:原始多行字符串文字(Swift 5+)

      Swift 5(在 Xcode 10.2 中,现在处于测试阶段)通过添加原始字符串来解决这个问题,它也可以像这样是多行的:

      let testing = "Testing 123"
      let htmlWrap = #"""
          <p>\(testing)</p>
          """#
      

      ... 如您所料,它将在您的 Web 视图中打印出“(testing)”。

      方法4:将HTML分离成自己的文件

      然而,在我看来,如果我正在处理 HTML,我会放入它自己的文件,然后使用 String(contentsOfFile: myFile) 初始化程序将该文本加载到一个字符串中。这会将 HTML 文本保留在它的拥有自己的文件,作为奖励,Xcode 将能够智能地帮助你,如果你去编辑它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-31
        • 2011-07-26
        • 2019-01-12
        • 1970-01-01
        • 1970-01-01
        • 2015-11-02
        相关资源
        最近更新 更多