จะตั้งค่าตระกูลฟอนต์เริ่มต้นใน React Native ได้อย่างไร?


100

มีการเทียบเท่ากับ CSS นี้ใน React Native หรือไม่เพื่อให้แอปใช้แบบอักษรเดียวกันทุกที่

body {
  font-family: 'Open Sans';
}

การนำไปใช้ด้วยตนเองในทุกโหนดข้อความดูเหมือนจะซับซ้อนเกินไป


1
มีคำตอบที่สมบูรณ์แบบสำหรับคำถามนี้หรือไม่ ??? ฉันไม่ต้องการเรียก style.text ใด ๆ หรืออะไรทำนองนั้น
MD Ashik

คำตอบ:


70

วิธีที่แนะนำคือสร้างส่วนประกอบของคุณเองเช่น MyAppText MyAppText จะเป็นส่วนประกอบง่ายๆที่แสดงผลองค์ประกอบข้อความโดยใช้สไตล์สากลของคุณและสามารถส่งผ่านอุปกรณ์ประกอบฉากอื่น ๆ เป็นต้น

https://facebook.github.io/react-native/docs/text.html#limited-style-inheritance


2
ขอบคุณนั่นคือสิ่งที่ฉันต้องการ ดูเหมือนว่าฉันยังไม่เข้าใจวิธีการองค์ประกอบอย่างลึกซึ้งพอ :)
Dagobert Renouf

2
สิ่งหนึ่งที่ไม่ชัดเจนมากจากเอกสารคือวิธีส่งผ่านคุณสมบัติในส่วนประกอบของคุณและเคารพสไตล์ในส่วนประกอบของคุณ คุณสามารถทำได้ดังนี้: gist.github.com/neilsarkar/c9b5fc7e67bbbe4c407eec17deb7311e
Neil Sarkar

1
@NeilSarkar ปัญหาหนึ่งของตัวอย่างส่วนสำคัญคือสไตล์ถูกสร้างขึ้นในตัวสร้าง ด้วยเหตุนี้หากสไตล์ prop เปลี่ยนไปคุณจะต้องการให้แสดงผลอีกครั้ง แต่ในกรณีนี้จะไม่ ควรจัดการrender()แทนตัวสร้าง การใช้ตะขอuseMemoก็ช่วยได้เช่นกันหากประสิทธิภาพเป็นสิ่งสำคัญ หรือหากคุณต้องการเก็บไว้ในตัวสร้างสิ่งสำคัญคือต้องเพิ่มcomponentDidUpdateตรรกะที่อัปเดตthis.styleเมื่อคอมโพเนนต์อัปเดตเนื่องจากการเปลี่ยนแปลงสไตล์
Fernando Rojo

จุดดีขอบคุณ! ดูเหมือนว่าจะมีคนเพิ่มรุ่น refactored เข้าไปในส่วนสำคัญด้วยเช่นกันซึ่งรวมสไตล์ไว้ในวิธีการเรนเดอร์ (ในกรณีของส่วนประกอบที่บริสุทธิ์)
Neil Sarkar

59

นอกจากนั้นเมื่อเร็ว ๆ นี้โมดูลโหนดที่ทำที่แก้ปัญหานี้เพื่อให้คุณไม่ต้องสร้างองค์ประกอบอื่น

https://github.com/Ajackster/react-native-global-props

https://www.npmjs.com/package/react-native-global-props

เอกสารระบุว่าในส่วนประกอบลำดับสูงสุดของคุณให้นำเข้าsetCustomTextฟังก์ชันเช่นนั้น

import { setCustomText } from 'react-native-global-props';

จากนั้นสร้างสไตล์ / อุปกรณ์ประกอบฉากแบบกำหนดเองที่คุณต้องการสำหรับTextคอมโพเนนต์ตอบสนองเนทีฟ ในกรณีของคุณคุณต้องการให้fontFamilyทำงานกับทุกTextองค์ประกอบ

const customTextProps = { 
  style: { 
    fontFamily: yourFont
  }
}

เรียกใช้setCustomTextฟังก์ชันและส่งอุปกรณ์ประกอบฉาก / สไตล์ของคุณเข้าไปในฟังก์ชัน

setCustomText(customTextProps);

จากนั้นTextส่วนประกอบที่ตอบสนองดั้งเดิมทั้งหมดจะมีfontFamily ที่คุณประกาศไว้พร้อมกับอุปกรณ์ประกอบฉาก / สไตล์อื่น ๆ ที่คุณมีให้


วิธีการใช้สำนวนในการใช้องค์ประกอบองค์ประกอบดูเหมือนจะเป็นทางเลือกที่ดีกว่าแม้ว่านี่จะเป็นการแฮ็กที่ยอดเยี่ยมก็ตาม
Daniel Little

เมื่อคอมโพเนนต์ข้อความไม่รองรับการเปลี่ยนฟอนต์เริ่มต้นนอกกรอบโซลูชันนี้จะดีขึ้นมาก ฉันอยากจะเพิ่มการควบคุมส่วนกลางในที่เดียวและใช้ส่วนประกอบเนทีฟมากกว่าที่จะสร้างส่วนประกอบของ wrapper สำหรับทุกรายละเอียดที่แอปเนทีฟที่แท้จริงมีให้
mienaikoe

ฉันลังเลระหว่าง 2 โซลูชันข้างต้นจริงๆแล้วฉันเกลียดที่จะติดตั้งปลั๊กอินที่ไม่เป็นทางการทำให้ react-native ยังคงเปลี่ยนไป แต่ในที่สุดฉันก็เลือกอันนี้เพราะมันช่วยประหยัดเวลาได้มาก ขอบคุณ!
Zhang Buzz

งั้นต้องโทร<Text style={styles.text}>?? ไม่ใช่โซลูชันที่สมบูรณ์แบบเช่นbody {font-family: 'Open Sans';} นั้นมีโซลูชันการอัปเดตใด ๆ ??
MD Ashik

1
Text style={styles.text}>ไม่มีคุณไม่จำเป็นต้องทำ คุณเพียงแค่ต้องประกาศอุปกรณ์ประกอบฉากที่คุณกำหนดเองไว้ที่ไหนสักแห่งในแอปพลิเคชันของคุณและจะนำไปใช้กับส่วนประกอบข้อความทั้งหมดของคุณ คล้ายกับbody {font-family: ....}
Ajackster

32

สำหรับ React Native 0.56.0+ ให้ตรวจสอบว่า defaultProps ถูกกำหนดก่อนหรือไม่:

Text.defaultProps = Text.defaultProps || {}

จากนั้นเพิ่ม:

Text.defaultProps.style =  { fontFamily: 'some_font' }

เพิ่มด้านบนในตัวสร้างของไฟล์ App.js (หรือส่วนประกอบรูทที่คุณมี)

ในการลบล้างสไตล์คุณสามารถสร้างสไตล์ออบเจ็กต์และกระจายจากนั้นเพิ่มสไตล์เพิ่มเติมของคุณ (เช่น{ ...baseStyle, fontSize: 16 })


4
อาจจะdefaultPropsไม่มีอยู่จริงเมื่อมีการเขียนคำตอบอื่น ๆ ทั้งหมด แต่ดูเหมือนจะเป็นวิธีที่จะทำในตอนนี้
ฟรีทั้งหมด

4
น่าเสียดายที่มันจะใช้ไม่ได้ถ้าเราลบล้างstyleprop พูดเพื่อปรับแต่งรูปแบบของTextส่วนประกอบเฉพาะ
Amerzilla

จริง แต่คุณสามารถหลีกเลี่ยงสิ่งนี้สร้างสไตล์ทั่วไปเป็นวัตถุและเมื่อใดก็ตามที่คุณต้องการแบบอักษรที่กำหนดเองเพียงแค่ส่งต่อไปยังองค์ประกอบอาร์เรย์ที่มีวัตถุนั้น + yourNewStyleObject @Amerzilla
AJA

1
มีปัญหาที่นั่น หากมีคนกำหนดstyleprop ในองค์ประกอบข้อความฟอนต์เริ่มต้นจะถูกแทนที่
Broda Noel

3
เป็นปี 2019 และทำงานได้อย่างสมบูรณ์แบบ จำไว้ว่าใน Android คุณไม่สามารถใช้ "-" ในชื่อไฟล์ได้ กำหนดชื่อไฟล์ฟอนต์ของคุณเช่น font_name.ttf
MRSafari

24

คุณสามารถแทนที่ลักษณะการทำงานของข้อความได้โดยเพิ่มสิ่งนี้ในส่วนประกอบใด ๆ ของคุณโดยใช้ข้อความ:

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]
    });
};

แก้ไข: เนื่องจาก React Native 0.56 Text.prototypeไม่ทำงานอีกต่อไป คุณต้องลบ.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]
    });
};

4
นี่เป็นทางออกที่ดี แต่คุณต้องเปลี่ยน: [origin.props.style, {color: 'red', fontFamily: 'Arial'}] -> [{color: 'red', fontFamily: 'Arial'}, origin props.style] มิฉะนั้นคุณจะแทนที่รูปแบบที่กำหนดเองที่กำหนดไว้ในส่วนประกอบ
Iaconis Simone

1
ทำงานได้ดีที่สุด Text.prototype.render ไม่ทำงานอีกต่อไป Text.render ทำ!
Kira

1
จะหลีกเลี่ยงไอคอนที่สืบทอดมาได้อย่างไร?
Venkat

1
ฉันเห็นด้วยกับ @IaconisSimone วิธีที่ดีที่สุดในการตั้งค่า fontFamily และเพื่อให้แน่ใจว่าจะไม่แทนที่สไตล์ที่กำหนดเอง
dczii

1
นี่คือหนทางที่จะไป
Witalo Benicio

14

ด้วย React-Native 0.56 วิธีการเปลี่ยนข้างต้นText.prototype.renderไม่ได้ผลอีกต่อไปดังนั้นคุณต้องใช้ส่วนประกอบของคุณเองซึ่งสามารถทำได้ในบรรทัดเดียว!

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>
...

@FancyJohn ตอนนี้จะมีตะขอและuseRef. reactjs.org/docs/hooks-reference.html#useref
Christopher Reid

11

เพิ่มฟังก์ชั่นนี้ลงในAppองค์ประกอบรากของคุณแล้วเรียกใช้จากตัวสร้างของคุณหลังจากเพิ่มแบบอักษรของคุณโดยใช้คำแนะนำเหล่านี้ 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;
            }
        };
    }
}

นี่คือสิ่งที่ฉันกำลังมองหาไม่ต้องการติดตั้งอะไรเพิ่มเติม
zevy_boy

หาก App.js ของฉันประกอบด้วยส่วนใหญ่const App = StackNavigator({...})และexport default Appฉันจะวางโค้ดนี้ไว้ที่ใดเนื่องจากฉันไม่คิดว่าจะสามารถใช้ตัวสร้างที่นี่ได้
kojow7

ฉันได้เพิ่มคำถามของตัวเองที่นี่stackoverflow.com/questions/50081042/…
kojow7

ทำไมตัวสร้างมากกว่า componentDidMount?
Dror Bar

2

สายสุด ๆ สำหรับหัวข้อนี้ แต่นี่ไป

TLDR; เพิ่มบล็อกต่อไปนี้ในไฟล์AppDelegate.m

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{

 ....
    // HERE: replace "Verlag" with your font
  [[UILabel appearance] setFont:[UIFont fontWithName:@"Verlag" size:17.0]];
  ....
}

บทสรุปของการไหลทั้งหมด

มีสองสามวิธีที่คุณสามารถทำได้นอกเหนือจากการใช้ปลั๊กอินเช่นreact-native-global-propsIll จะแนะนำคุณทีละขั้นตอน

การเพิ่มแบบอักษรลงในแพลตฟอร์ม

วิธีเพิ่มแบบอักษรในโครงการ IOS

ก่อนอื่นมาสร้างที่ตั้งสำหรับสินทรัพย์ของเรา มาสร้างไดเร็กทอรีต่อไปนี้ที่รูทของเรา

``

ios/
static/
       fonts/

``

ตอนนี้ให้เพิ่ม NPM "React Native" ใน package.json ของเรา

  "rnpm": {
    "static": [
   "./static/fonts/"
    ]
  }

ตอนนี้เราสามารถเรียกใช้ "ลิงก์ตอบกลับ" เพื่อเพิ่มเนื้อหาของเราไปยังแอปเนทีฟของเรา

ตรวจสอบหรือดำเนินการด้วยตนเอง

ที่ควรเพิ่มชื่อฟอนต์ของคุณลงในโปรเจ็กต์.plist (สำหรับผู้ใช้โค้ด VS รันcode ios/*/Info.plistเพื่อยืนยัน)

สมมติว่าVerlagเป็นแบบอักษรที่คุณเพิ่มควรมีลักษณะดังนี้:

     <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>

ตอนนี้คุณได้จับคู่พวกเขาแล้วตอนนี้เรามาตรวจสอบให้แน่ใจว่ามีอยู่จริงและกำลังโหลด (นี่คือวิธีที่คุณทำด้วยตนเอง)

ไปที่"Build Phase" > "Copy Bundler Resource"หากไม่ได้ผลคุณจะต้องเพิ่มด้วยตนเองที่นี่

1_uuz0__3kx2vvguz37bhvya

รับชื่อแบบอักษร (รู้จักโดย XCode)

ก่อนอื่นให้เปิดบันทึก XCode ของคุณเช่น:

XXXX

จากนั้นคุณสามารถเพิ่มบล็อกต่อไปนี้ในของคุณAppDelegate.mเพื่อบันทึกชื่อของฟอนต์และตระกูลฟอนต์

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    .....


  for (NSString* family in [UIFont familyNames])
  {
    NSLog(@"%@", family);
    for (NSString* name in [UIFont fontNamesForFamilyName: family])
    {
      NSLog(@" %@", name);
    }
  }

  ...
}

เมื่อคุณเรียกใช้คุณจะพบแบบอักษรของคุณหากโหลดอย่างถูกต้องที่นี่เราพบของเราในบันทึกดังนี้:

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

ตอนนี้เรารู้แล้วว่ามันโหลดVerlagตระกูลและเป็นฟอนต์ในตระกูลนั้น

  • Verlag-Book
  • Verlag-BlackItalic
  • Verlag-BoldItalic
  • Verlag-XLight
  • Verlag-Bold
  • Verlag-Black
  • Verlag-XLightItalic
  • Verlag-LightItalic
  • Verlag-BookItalic
  • Verlag-Light

ตอนนี้เป็นชื่อที่คำนึงถึงตัวพิมพ์เล็กและใหญ่ที่เราสามารถใช้ในตระกูลแบบอักษรของเราที่เราสามารถใช้ในแอปตอบกลับ

Got -'em ตั้งค่าแบบอักษรเริ่มต้นแล้ว

จากนั้นตั้งค่าแบบอักษรเริ่มต้นเพื่อเพิ่มชื่อตระกูลแบบอักษรของคุณ AppDelegate.mด้วยบรรทัดนี้

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{

 ....
    // ADD THIS LINE (replace "Verlag" with your font)

  [[UILabel appearance] setFont:[UIFont fontWithName:@"Verlag" size:17.0]];
  ....
}

เสร็จแล้ว


แนวทางที่ดีที่สุด แต่ใช้งานไม่ได้มีอะไรเกี่ยวข้องกับการอัปเดต las ของ RN 0.57 หรือไม่?
user2976753

1

ที่เหมาะกับฉัน: เพิ่มแบบอักษรที่กำหนดเองใน React Native

ดาวน์โหลดฟอนต์ของคุณและวางไว้ในโฟลเดอร์ assets / ฟอนต์เพิ่มบรรทัดนี้ใน package.json

 "rnpm": {
"assets": ["assets/fonts/Sarpanch"]}

จากนั้นเปิดเทอร์มินัลและรันคำสั่งนี้: ลิงก์ตอบกลับเนทีฟ

ตอนนี้คุณพร้อมแล้ว สำหรับรายละเอียดเพิ่มเติมขั้นตอน เยี่ยมชมลิงค์ที่กล่าวถึงข้างต้น



โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.