我的项目是clojureScript试剂对expo的本机响应,我需要自定义字体。我已经阅读了expo的有关如何自定义字体的文档,并尝试按照ClojureScript的方式按照说明进行操作。
(expo的自定义字体说明 https://docs.expo.io/versions/latest/guides/using-custom-fonts)
异步加载字体,正在加载异步功能
(defn load-font-async
[name url]
(.call (aget Font "loadAsync")
Font
(js-obj "Kanit" url)))
在渲染之前称为“加载异步功能”。
(->
(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。仅将全部应用程序用于字体加载不是很好,但我只需要确保字体已加载即可。 (我需要重构)
我将字体系列样式添加到文本组件
[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 ..... }))))
,它仍然有相同的错误:(。
答案 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)))