我无法在博览会的试剂反应本机上自定义字体吗?

时间:2018-08-25 17:05:54

标签: react-native fonts clojurescript expo reagent

我的项目是clojureScript试剂对expo的本机响应,我需要自定义字体。我已经阅读了expo的有关如何自定义字体的文档,并尝试按照ClojureScript的方式按照说明进行操作。

(expo的自定义字体说明 https://docs.expo.io/versions/latest/guides/using-custom-fonts

  1. 异步加载字体,正在加载异步功能

    (defn load-font-async
     [name url]
     (.call (aget Font "loadAsync")
       Font
       (js-obj "Kanit" url)))
    
  2. 在渲染之前称为“加载异步功能”。

    (->
     (expo/load-font-async "Kanit" (js/require "./assets/fonts/Kanit/Kanit-Regular.ttf"))
     (.then (fn [] (.registerComponent app-registry "main" #(r/reactify-component app-root))))))
    

    ps。仅将全部应用程序用于字体加载不是很好,但我只需要确保字体已加载即可。 (我需要重构)

  3. 我将字体系列样式添加到文本组件

    [text {:style {:font-family "Kanit"}} "test"]
    

但是文本组件找不到我已经声明并加载的字体家族“ Kanit”。错误是

 Unrecognized font family 'Kanit'

我现在还是一片空白,这个解决方案有什么问题吗?

ps。告诉我是否需要更多信息,谢谢您的答复:)

已更新:根据Chris Callwait的建议,我将expo/load-font-async移到了应用程序根目录,并调度用于告诉文本组件仅加载字体上的附加字体系列。像这样

(defn app-root []
  (let [ ... ]
  (expo/load-font-async [{"Kanit" (js/require "./assets/fonts/Kanit/Kanit-Regular.ttf")}]
    (rf/dispatch [:app/set-font-loaded true]))
  (r/create-class {:reagent-render ..... }))))

,它仍然有相同的错误:(。

1 个答案:

答案 0 :(得分:0)

检查此解决方案,它使用Promise.All调用Font.loadAsync,并一次加载多个字体。

(defn- cache-fonts [fonts]
  (for [font fonts]
    (when font
      (.loadAsync Font font))))

(defn- cast-as-array [coll]
  (if (or (array? coll)
          (not (reduceable? coll)))
    coll
    (into-array coll)))

(defn all [coll]
  (.all js/Promise (cast-as-array coll)))

(defn load-fonts [fonts cb]
  (->
    (all (cache-fonts (clj->js fonts)))
    (.then (fn [resp]
             (if cb (cb))))
    (.catch (fn [err]
              (println "Loading font failed: " (aget err "message"))))))


(load-fonts [{"Kanit" (js/require "./assets/fonts/Kanit/Kanit-Regular.ttf")}]
            (println "Font success loaded"))

我的初始化:

(defn app-root []
  (let [...]
    (load-fonts ...)
    (fn []
      ...)))

(defn init []
  (.registerComponent app-registry "main" #(r/reactify-component app-root)))