Esiste un equivalente a questo CSS in React Native, in modo che l'app utilizzi lo stesso carattere ovunque?
body {
font-family: 'Open Sans';
}
Applicarlo manualmente su ogni nodo di testo sembra eccessivamente complicato.
Esiste un equivalente a questo CSS in React Native, in modo che l'app utilizzi lo stesso carattere ovunque?
body {
font-family: 'Open Sans';
}
Applicarlo manualmente su ogni nodo di testo sembra eccessivamente complicato.
Risposte:
Il modo consigliato è creare il proprio componente, come MyAppText. MyAppText sarebbe un componente semplice che rende un componente di testo usando il tuo stile universale e può passare attraverso altri oggetti di scena, ecc.
https://facebook.github.io/react-native/docs/text.html#limited-style-inheritance
render()posto del costruttore. L'uso di ganci con useMemopotrebbe anche aiutare se l'efficienza è importante. In alternativa, se vuoi mantenerlo nel costruttore, è importante aggiungere una componentDidUpdatelogica che si aggiorni this.stylequando il componente si aggiorna a causa di un cambio di stile prop.
Recentemente è stato creato un modulo nodo che risolve questo problema in modo da non dover creare un altro componente .
https://github.com/Ajackster/react-native-global-props
https://www.npmjs.com/package/react-native-global-props
La documentazione afferma che nel componente di ordine più alto, importa la setCustomTextfunzione in questo modo.
import { setCustomText } from 'react-native-global-props';
Quindi, crea lo stile / oggetti di scena personalizzati che desideri per il Textcomponente nativo di reazione . Nel tuo caso, vorresti che fontFamily lavorasse su ogni Textcomponente.
const customTextProps = {
style: {
fontFamily: yourFont
}
}
Chiama la setCustomTextfunzione e passa i tuoi oggetti di scena / stili nella funzione.
setCustomText(customTextProps);
E poi tutti i Textcomponenti nativi di reazione avranno la tua fontFamily dichiarata insieme a qualsiasi altro oggetto / stile che fornisci.
<Text style={styles.text}>?? Non è una soluzione perfetta come quella body {font-family: 'Open Sans';} ha una soluzione di aggiornamento ??
Text style={styles.text}>. Hai solo bisogno di dichiarare i tuoi oggetti di scena personalizzati da qualche parte nella tua applicazione e verranno applicati a tutti i tuoi componenti di testo. È molto simile abody {font-family: ....}
Per React Native 0.56.0+ controlla se defaultProps è definito per primo:
Text.defaultProps = Text.defaultProps || {}
Poi aggiungi:
Text.defaultProps.style = { fontFamily: 'some_font' }
Aggiungi quanto sopra nel costruttore del file App.js (o qualsiasi componente radice che hai).
Per sovrascrivere lo stile puoi creare un oggetto stile e diffonderlo, quindi aggiungere il tuo stile aggiuntivo (ad es. { ...baseStyle, fontSize: 16 })
defaultPropsnon esisteva quando tutte le altre risposte furono scritte, ma questo sembra essere il modo per farlo ora.
styleelica, ad esempio, per modificare gli stili di Textcomponenti particolari
styleprop nel componente Text, il font predefinito verrà sostituito.
Puoi sovrascrivere il comportamento del testo aggiungendolo in qualsiasi componente utilizzando il testo:
let oldRender = Text.prototype.render;
Text.prototype.render = function (...args) {
let origin = oldRender.call(this, ...args);
return React.cloneElement(origin, {
style: [{color: 'red', fontFamily: 'Arial'}, origin.props.style]
});
};
Modifica: da React Native 0.56, Text.prototypenon funziona più. È necessario rimuovere .prototype:
let oldRender = Text.render;
Text.render = function (...args) {
let origin = oldRender.call(this, ...args);
return React.cloneElement(origin, {
style: [{color: 'red', fontFamily: 'Arial'}, origin.props.style]
});
};
Inserisci
"rnpm": {
"assets": [
"./assets/fonts/"
]
}
in package.json
poi corrireact-native link
Con React-Native 0.56, il metodo di modifica di cui sopra Text.prototype.rendernon funziona più, quindi devi usare il tuo componente, che può essere fatto in una riga!
MyText.js
export default props => <Text {...props} style={[{fontFamily: 'Helvetica'}, props.style]}>{props.children}</Text>
AnotherComponent.js
import Text from './MyText';
...
<Text>This will show in default font.</Text>
...
useRef. reactjs.org/docs/hooks-reference.html#useref
Aggiungi questa funzione al tuo Appcomponente root e quindi eseguila dal tuo costruttore dopo aver aggiunto il tuo carattere usando queste istruzioni. https://medium.com/react-native-training/react-native-custom-fonts-ccc9aacf9e5e
import {Text, TextInput} from 'react-native'
SetDefaultFontFamily = () => {
let components = [Text, TextInput]
const customProps = {
style: {
fontFamily: "Rubik"
}
}
for(let i = 0; i < components.length; i++) {
const TextRender = components[i].prototype.render;
const initialDefaultProps = components[i].prototype.constructor.defaultProps;
components[i].prototype.constructor.defaultProps = {
...initialDefaultProps,
...customProps,
}
components[i].prototype.render = function render() {
let oldProps = this.props;
this.props = { ...this.props, style: [customProps.style, this.props.style] };
try {
return TextRender.apply(this, arguments);
} finally {
this.props = oldProps;
}
};
}
}
const App = StackNavigator({...})e export default Appdove collocherei esattamente questo codice perché non penso di poter utilizzare un costruttore qui?
Super tardi per questo thread, ma qui va.
TLDR; Aggiungi il seguente blocco nel tuo fileAppDelegate.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
....
// HERE: replace "Verlag" with your font
[[UILabel appearance] setFont:[UIFont fontWithName:@"Verlag" size:17.0]];
....
}
Alcuni modi per farlo al di fuori dell'utilizzo di un plug-in come react-native-global-propscosì ti guiderò passo dopo passo.
Per prima cosa creiamo una posizione per le nostre risorse. Facciamo la seguente directory alla nostra radice.
`` `
ios/
static/
fonts/
`` `
Ora aggiungiamo un NPM "React Native" nel nostro package.json
"rnpm": {
"static": [
"./static/fonts/"
]
}
Ora possiamo eseguire il "collegamento nativo di reazione" per aggiungere le nostre risorse alle nostre app native.
Ciò dovrebbe aggiungere i nomi dei caratteri nei progetti .plist
(per gli utenti di codice VS eseguiti code ios/*/Info.plistper confermare)
Supponiamo che Verlagsia il carattere che hai aggiunto, dovrebbe assomigliare a questo:
<dict>
<plist>
.....
<key>UIAppFonts</key>
<array>
<string>Verlag Bold Italic.otf</string>
<string>Verlag Book Italic.otf</string>
<string>Verlag Light.otf</string>
<string>Verlag XLight Italic.otf</string>
<string>Verlag XLight.otf</string>
<string>Verlag-Black.otf</string>
<string>Verlag-BlackItalic.otf</string>
<string>Verlag-Bold.otf</string>
<string>Verlag-Book.otf</string>
<string>Verlag-LightItalic.otf</string>
</array>
....
</dict>
</plist>
Ora che li hai mappati, ora assicuriamoci che siano effettivamente lì e vengano caricati (questo è anche il modo in cui lo faresti manualmente).
Vai a "Build Phase" > "Copy Bundler Resource", Se non ha funzionato, aggiungi manualmente sotto di loro qui.

Per prima cosa apri i tuoi registri XCode, come:
Quindi puoi aggiungere il seguente blocco nel tuo AppDelegate.mper registrare i nomi dei caratteri e della famiglia di caratteri.
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
.....
for (NSString* family in [UIFont familyNames])
{
NSLog(@"%@", family);
for (NSString* name in [UIFont fontNamesForFamilyName: family])
{
NSLog(@" %@", name);
}
}
...
}
Una volta eseguito dovresti trovare i tuoi font se caricati correttamente, qui abbiamo trovato i nostri in log come questo:
2018-05-07 10:57:04.194127-0700 MyApp[84024:1486266] Verlag
2018-05-07 10:57:04.194266-0700 MyApp[84024:1486266] Verlag-Book
2018-05-07 10:57:04.194401-0700 MyApp[84024:1486266] Verlag-BlackItalic
2018-05-07 10:57:04.194516-0700 MyApp[84024:1486266] Verlag-BoldItalic
2018-05-07 10:57:04.194616-0700 MyApp[84024:1486266] Verlag-XLight
2018-05-07 10:57:04.194737-0700 MyApp[84024:1486266] Verlag-Bold
2018-05-07 10:57:04.194833-0700 MyApp[84024:1486266] Verlag-Black
2018-05-07 10:57:04.194942-0700 MyApp[84024:1486266] Verlag-XLightItalic
2018-05-07 10:57:04.195170-0700 MyApp[84024:1486266] Verlag-LightItalic
2018-05-07 10:57:04.195327-0700 MyApp[84024:1486266] Verlag-BookItalic
2018-05-07 10:57:04.195510-0700 MyApp[84024:1486266] Verlag-Light
Quindi ora sappiamo che ha caricato la Verlagfamiglia e sono i caratteri all'interno di quella famiglia
Verlag-BookVerlag-BlackItalicVerlag-BoldItalicVerlag-XLightVerlag-BoldVerlag-BlackVerlag-XLightItalicVerlag-LightItalicVerlag-BookItalicVerlag-LightQuesti sono ora i nomi sensibili al maiuscolo / minuscolo che possiamo usare nella nostra famiglia di caratteri che possiamo usare nella nostra app nativa di reazione.
Quindi, per impostare un carattere predefinito per aggiungere il nome della famiglia di caratteri nel tuo AppDelegate.mcon questa riga
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
....
// ADD THIS LINE (replace "Verlag" with your font)
[[UILabel appearance] setFont:[UIFont fontWithName:@"Verlag" size:17.0]];
....
}
Fatto.
Per me funziona: aggiungi caratteri personalizzati in React Native
scarica i tuoi font e inseriscili nella cartella assets / fonts, aggiungi questa riga in package.json
"rnpm": {
"assets": ["assets/fonts/Sarpanch"]}
quindi apri il terminale ed esegui questo comando: react-native link
Ora sei a posto. Per un passaggio più dettagliato. visitare il link sopra menzionato